比如每日汇总:
Mxx.select("sum( col_a * col_b ) as s, date(created_at) as created_date").group("created_date")
这样可以查询每日汇总的数据,比如 2013.3.3 日当天的汇总数据
如果要每日累计汇总的数据,怎么查询,比如从 2012.3.3 到 2013.3.3 日累计的汇总 sum 数。
sql 有个 extract 函数,试试: Mxx.select("sum( col_a * col_b ) as s, date(extract(year from created_at)) as created_date").group("created_date")
建议使用 https://github.com/eoecn/statlysis 这个面向 ORM 统计的 Ruby DSL,具体见 README,比这样复杂地拼 SQL 好理解多了。
我看到你这里需要对两个字段做额外计算,建议也是预先在事务里写入到该表其他字段为好。
补: 抱歉没看到 SQL 里有 SUM,过段时间给出解决方案:)
下午我给 statlysis.gem 增加了对 sum 的支持 。主题的解决方案如下:
第一步,数据准备:
class Mxx; include Mongoid::Document; field :col_sum, :type => Float; end
class Mxx
before_save do
self.col_sum = self.col_a * self.col_b
end
end
第二步,配置统计:
Statlysis.setup do
daily Mxx, :sum_columns => [:col_sum]
end
第三步,统计和察看结果:
cron = Statlysis.daily['mxx'].first => #<Statlysis::Timely:0x7f891cc9db30 @source_type=:mongoid, @time_column=:created_at, @time_unit=:day, @time_zone=#<ActiveSupport::TimeZone:0x7f891b4783e8>, @multiple_dataset=#<Statlysis::MongoidDataset:0x7f891cca2338>, @sum_columns=#<Array:0x7f891cc9fd18>, @stat_table_name="timely_mxxes_d", @stat_model=#<Class:0x7f8920966918>>
cron.stat_model # => TimelyMxxesD
cron.run
# 统计结果类似于
cron.output[1] # => {:t=>Fri, 14 Dec 2012 00:00:00 +0800, :timely_c=>11, :totally_c=>16, :timely_favcount_s=>24.0, :totally_favcount_s=>38.0}
然后显示的时候从统计表 timely_mxxes_d 抽取就可以了,平均数,中位数等都可以从里面算出来。
欢迎报告 BUG 或功能改进:)