查询每天布尔列的累积总和

时间:2015-04-20 16:45:26

标签: ruby-on-rails postgresql ruby-on-rails-4 activerecord

我一直试图每天获得一个布尔列的累积总和。我使用#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]]

现在有效,直到我能找到更好的方法。

2 个答案:

答案 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)'

取决于用户查看报告的位置,可能会或可能不会返回他们期望的计数

    在这种情况下,
  • postgres AT TIME ZONE可能对您有所帮助

答案 1 :(得分:0)

每天查询布尔列的累积总和:

Device.where(boxed: true).group('date(updated_at)').sum('date(updated_at)')