【问题标题】:Querying a cumulative sum of a boolean column per day查询布尔列每天的累计和
【发布时间】:2015-04-20 16:45:25
【问题描述】:

我一直在尝试获取每天布尔列的累积总和。我尝试了不同的方法使用#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]]

在我想出更好的方法之前,这暂时有效。

【问题讨论】:

  • 例如,2015 年 4 月 18 日=>44 和 2015 年 4 月 18 日=>92 之间有什么区别?你能告诉我们一些设备表的数据吗
  • @tanorix 不同之处在于,4 月 18 日有 44 台设备被装箱,但到目前为止,将 4 月 17 日和 4 月 18 日的总数相加,总共有 92 台设备被装箱。
  • 所以您希望计数是运行总数而不是按日期计数?
  • @muistooshort 没错。
  • 很高兴你有答案。我仍然认为它可以完全在 SQL 查询中实现,因为这是我可能需要做的事情,我将继续自己研究它。这是一个很好的问题。

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


【解决方案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 在这种情况下可能会对您有所帮助

【讨论】:

  • 感谢您的回答。我最终做了与此非常相似的事情(我将其发布到我的问题中)。感谢您提供时区提示,我会记住这一点。
【解决方案2】:

查询布尔列每天的累计和:

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

【讨论】:

  • 感谢您的回答。我之前确实尝试过这个查询并得到了一些疯狂的数字。这是我尝试此查询时得到的结果:{2015 年 4 月 17 日星期五=>967220016,2015 年 4 月 18 日星期六=>886618392,2015 年 4 月 19 日星期日=>100752095,2015 年 4 月 20 日星期一=>967220160}跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多