я сталкивался с той же проблемой.
Я обнаружил, что легко группировать по любому минутному интервалу
просто делим эпоху на минуты в количестве секунд, а затем либо округляем, либо используем пол, чтобы получить остаток. Поэтому, если вы хотите получить интервал в 5 минут , вы должны использовать 300 секунд .
</p>
<pre><code>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
Это вернет данные, правильно сгруппированные по выбранному интервалу минут; однако он не будет возвращать интервалы, которые не содержат никаких данных. Чтобы получить эти пустые интервалы, мы можем использовать функцию generate_series .
</p>
<pre><code>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
Теперь, чтобы получить результат с интервалом с нулевым числом вхождений, мы просто внешнее объединяем оба набора результатов .
</p>
<pre><code>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
на 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
Интервал можно легко изменить, отрегулировав последний параметр generate_series. В нашем случае мы используем '5m' , но это может быть любой интервал , который мы хотим.