微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – 如何按日期计数获得此postgres组包括0天

我有这个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

因为<< -sql是插值的,所以你可以使用里面的变量来调整你的查询.

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

相关推荐