我有这个 Postgres 查询来选择过去 30 天的所有用户并按计数分组。
@users = User.where('created_at >= ?', last_30_day).count(:order => 'DATE(created_at) ASC', :group => ["DATE(created_at)"])
问题是这样返回
2014-01-15 6
2014-01-13 2
2014-01-09 1
我也想像这样获得 cero 结果的日子
2014-01-15 6
2014-01-14 0
2014-01-13 2
2014-01-12 0
2014-01-11 0
2014-01-10 0
2014-01-09 1
知道怎么做吗?
最佳答案
要详细说明@mu_is_too_short 答案,您可以使用 generate_series
来完成像这样:
SELECT dt.series, COUNT(u.created_at)
FROM users u
RIGHT OUTER JOIN (
SELECT
GENERATE_SERIES( (NOW() - INTERVAL '30 day')::date, NOW()::date, '1 day')::date
AS series
) AS dt
on DATE_TRUNC('month', u.created_at) = dt.series
GROUP BY dt.series
ORDER BY dt.series DESC
产生的结果如下:
series | count
------------+-------
2014-01-08 | 0
2014-01-07 | 0
2014-01-06 | 0
2014-01-05 | 0
2014-01-04 | 0
2014-01-03 | 0
2014-01-02 | 0
2014-01-01 | 1
2013-12-31 | 0
此外,ActiveRecord 语法非常丑陋,最好的办法是用上面的纯 SQL 编写它并只检索原始结果。像这样的东西:
sql = <<-SQL
SELECT dt.series, COUNT(u.created_at)
FROM users u
RIGHT OUTER JOIN (
SELECT
GENERATE_SERIES( (NOW() - INTERVAL '30 day')::date, NOW()::date, '1 day')::date
AS series
) AS dt
on DATE_TRUNC('month', u.created_at) = dt.series
GROUP BY dt.series
ORDER BY dt.series DESC
SQL
records = User.connection.select_all(sql)
records.each do |record|
puts record['series']
end
因为 <<-SQL
是内插的,您可以使用内部变量来调整您的查询。
关于ruby-on-rails - 如何按日期计数获取此 postgres 组包括带 0 的天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21007021/