我一直试图每天获得一个布尔列的累积总和。我使用#sum
尝试了不同的方法,并查看了#distinct
(通过查看Stack Overflow上的其他帖子)但是还没有能够成功实现其中任何一种方法我喜欢看哈希的方式。
目前,这是我的查询:
Device.where(boxed: true).group('date(updated_at)').count
这给了我这个:
{Fri, 17 Apr 2015=>48, Sat, 18 Apr 2015=>44, Sun, 19 Apr 2015=>5, Mon, 20 Apr 2015=>48}
但我希望它看起来像这样:
{Fri, 17 Apr 2015=>48, Sat, 18 Apr 2015=>92, Sun, 19 Apr 2015=>97, Mon, 20 Apr 2015=>145}
我正在使用Rails 4和Postgres。任何帮助将不胜感激。
修改
我最终这样做是为了获得累计金额,即使这可能不是最好的方式或优雅:
data_all_time = Device.where(boxed: true).group('date(updated_at)').count
data_all_time_keys = data_all_time.keys
data_all_time_values = data_all_time.values
sum = 0
data_all_time_values.map!{|x| sum += x}
all_time_sum_tuple = data_all_time_keys.zip(data_all_time_values)
我最终得到这样的东西:
[["April 17, 2015", 48], ["April 18, 2015", 92], ["April 19, 2015", 97], ["April 20, 2015", 145]]
现在有效,直到我能找到更好的方法。
答案 0 :(得分:1)
我会保持你的sql
data = Device.where(boxed: true).group('date(updated_at)').count
然后在ruby中进行自定义聚合
result = {}
keys = []
data.each_with_index do |(key, value), index|
keys << key
result[key] = data.values_at(*keys).sum
end
上面的红宝石可以清理一下,但是......
需要注意的另一件事 - 微妙的时区问题
-- your data is probably stored in UTC and this will group by the UTC dates
'date(updated_at)'
取决于用户查看报告的位置,可能会或可能不会返回他们期望的计数
答案 1 :(得分:0)
每天查询布尔列的累积总和:
Device.where(boxed: true).group('date(updated_at)').sum('date(updated_at)')