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是插值的,所以你可以使用里面的变量来调整你的查询. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |