加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 02:46:43 所属栏目:百科 来源:网络整理
导读:我有这个Postgres查询来选择过去30天内的所有用户并按计数分组. @users = User.where('created_at = ?',last_30_day).count(:order = 'DATE(created_at) ASC',:group = ["DATE(created_at)"]) 问题是这样返回 2014-01-15 62014-01-13 22014-01-09 1 而且我希
我有这个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是插值的,所以你可以使用里面的变量来调整你的查询.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读