Как сделать GROUP BY несколько дней в PostgreSQL? - PullRequest
1 голос
/ 28 июля 2011

Следующий код генерирует даты и подсчитывает записи по дням.

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 для каждого дня, он будет считать отдельные user_id для каждого 2-дневного периода.

Это отличается от суммирования отсчетов за 2 дня, так как user_id должен учитываться только один раз за каждый двухдневный период.

Работа в PostgreSQL 8.3.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 28 июля 2011
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
1 голос
/ 28 июля 2011

Попробуйте это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...