Eu me deparei com o mesmo problema.
Descobri que é fácil agrupar por qualquer intervalo de minuto, basta dividir a época por minutos em quantidade de segundos e, em seguida, arredondar ou usar o chão para se livrar do restante. Portanto, se você quiser obter o intervalo em 5 minutos, deverá usar 300 segundos .
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
Isso retornará os dados agrupados corretamente pelo intervalo de minutos selecionado; no entanto, ele não retornará os intervalos que não contêm dados. Para obter esses intervalos vazios, podemos usar a função generate_series .
SELECT generate_series(MIN(date_trunc('hour',timestamp_column)),
max(date_trunc('minute',timestamp_column)),'5m') as interval_alias FROM
TABLE_NAME
Resultado:
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
Agora, para obter o resultado com intervalo com zero ocorrências, apenas juntamos os dois conjuntos de resultados .
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
O resultado final incluirá a série com todos os intervalos de 5 minutos, mesmo aqueles que não têm valores.
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
O intervalo pode ser facilmente alterado ajustando o último parâmetro de generate_series. No nosso caso, usamos '5m', mas pode ser qualquer intervalo que quisermos.