Я натрапив на те саме питання.
Я виявив, що легко згрупувати за будь-яким хвилинним інтервалом, це просто поділ епохи на хвилини за кількістю секунд, а потім або округлення, або використання підлоги, щоб отримати проїзд до решти. Отже, якщо ви хочете отримати інтервал за 5 хвилин, ви використаєте 300 секунд .
SELECT COUNT(*) cnt,
to_timestamp(floor((extract('epoch' from timestamp_column) / 300 )) * 300)
AT TIME ZONE 'UTC' as interval_alias
FROM TABLE_NAME GROUP BY interval_alias
interval_alias cnt
2010-11-16 10:30:00 2
2010-11-16 10:35:00 10
2010-11-16 10:45:00 8
2010-11-16 10:55:00 11
Це поверне дані правильно групувати за вибраний інтервал хвилин; однак він не поверне інтервали, які не містять даних. Для того, щоб отримати ці порожні інтервали, ми можемо використовувати функцію generirati_series .
SELECT generate_series(MIN(date_trunc('hour',timestamp_column)),
max(date_trunc('minute',timestamp_column)),'5m') as interval_alias FROM
TABLE_NAME
Результат:
interval_alias
2010-11-16 10:30:00
2010-11-16 10:35:00
2010-11-16 10:40:00
2010-11-16 10:45:00
2010-11-16 10:50:00
2010-11-16 10:55:00
Тепер, щоб отримати результат з інтервалом з нульовими випадками, ми просто зовні приєднуємо обидва набори результатів .
SELECT series.minute as interval, coalesce(cnt.amnt,0) as count from
(
SELECT count(*) amnt,
to_timestamp(floor((extract('epoch' from timestamp_column) / 300 )) * 300)
AT TIME ZONE 'UTC' as interval_alias
from TABLE_NAME group by interval_alias
) cnt
RIGHT JOIN
(
SELECT generate_series(min(date_trunc('hour',timestamp_column)),
max(date_trunc('minute',timestamp_column)),'5m') as minute from TABLE_NAME
) series
on series.minute = cnt.interval_alias
Кінцевий результат включатиме серію з усіма 5-хвилинними інтервалами, навіть ті, що не мають значень.
interval count
2010-11-16 10:30:00 2
2010-11-16 10:35:00 10
2010-11-16 10:40:00 0
2010-11-16 10:45:00 8
2010-11-16 10:50:00 0
2010-11-16 10:55:00 11
Інтервал можна легко змінити, налаштувавши останній параметр create_series. У нашому випадку ми використовуємо "5 м", але це може бути будь-який інтервал, який ми хочемо.