2011-07-27 6 views
1

次のコードは、日付とカウントレコードを1日ごとに生成します。PostgreSQLで数日間GROUP BYする方法は?

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日間ごとに1回だけカウントする必要があるためです。

PostgreSQL 8.3での作業

ありがとうございました。

答えて

2
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 
+0

シンプルだったことを!ありがとう! –

1

このお試しください:

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 
関連する問題