ruby-on-rails - 如何按日期计数获取此 postgres 组包括带 0 的天数

标签 ruby-on-rails postgresql activerecord rails-activerecord

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

相关文章:

ruby-on-rails - ActionView::Template::Error (PG::UndefinedColumn: ERROR: 列 "weeknumber"不存在

postgresql - 在 PostgreSQL 中计算文件大小

mysql - Rails 左连接并包含不存在的左表记录

ruby-on-rails - Ruby 中缺少 libyaml(在 Rails 上)OCRA Build

ruby-on-rails - 在特定于环境的配置文件中配置未定义

ruby-on-rails - jQuery UI DatePicker 允许过去的日期,今天显示

python - 我无法从数据帧保存到 postgresql

ruby-on-rails - Rails 是否有办法将复选框从 "on"转换为 true?

ruby-on-rails - rails 对象预期得到字符串

ruby-on-rails - rails skip_before_filter :verify_authenticity_token not working