【问题标题】:How to GROUP BY several days in PostgreSQL?如何在 PostgreSQL 中按几天分组?
【发布时间】:2011-10-14 17:17:12
【问题描述】:

以下代码生成日期并按天计算记录。

SELECT ts, COUNT(DISTINCT(user_id)) FROM 
( SELECT current_date + s.ts FROM generate_series(-20,0,1) AS s(ts) )
AS series(ts)
LEFT JOIN messages
ON messages.created_at::date = ts
GROUP BY ts
ORDER BY ts

输出如下:

2011-07-07   0
2011-07-08   0
2011-07-09   0
2011-07-10   0
2011-07-11   0
2011-07-12   94
2011-07-13   56
2011-07-14   35
2011-07-15   56
2011-07-16   0
2011-07-17   13

您将如何将其修改为按 2 天分组,以便结果重叠?它不是每天计算不同的 user_id,而是每 2 天计算不同的 user_id。

这与将 2 天的计数相加不同,因为 user_id 每 2 天应该只计算一次。

在 PostgreSQL 8.3 中工作。

谢谢。

【问题讨论】:

    标签: ruby-on-rails-3 postgresql select count group-by


    【解决方案1】:
    SELECT ts, COUNT(DISTINCT(user_id)) FROM 
    ( SELECT current_date + s.ts FROM generate_series(-20,0,1) AS s(ts) )
    AS series(ts)
    LEFT JOIN messages
    ON messages.created_at::date between ts - 1 and ts -- JOIN on a range
    GROUP BY ts
    ORDER BY ts
    

    【讨论】:

      【解决方案2】:

      试试这个:

      SELECT ts, COUNT(DISTINCT(user_id)) 
      
      FROM 
      
      ( SELECT current_date + s.ts 
        FROM generate_series(-20,0,2) AS s(ts) ) AS series(ts)
      
      LEFT JOIN messages
      ON messages.created_at::date = ts or messages.created_at::date = ts + 1
      
      GROUP BY ts
      ORDER BY ts
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-02
        相关资源
        最近更新 更多