我有这个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,'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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。