Mi sono imbattuto nello stesso problema.
Ho scoperto che è facile raggruppare in base a intervalli di un minuto, semplicemente dividendo l' epoca per minuti in secondi e quindi arrotondando o usando il pavimento per ottenere il giro del resto. Quindi, se vuoi ottenere l'intervallo in 5 minuti, dovresti usare 300 secondi .
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
Ciò restituirà i dati correttamente raggruppati per l'intervallo di minuti selezionato; tuttavia, non restituirà gli intervalli che non contengono dati. Per ottenere quegli intervalli vuoti possiamo usare la funzione generate_series .
SELECT generate_series(MIN(date_trunc('hour',timestamp_column)),
max(date_trunc('minute',timestamp_column)),'5m') as interval_alias FROM
TABLE_NAME
Risultato:
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
Ora per ottenere il risultato con intervallo con zero occorrenze, dobbiamo semplicemente unire entrambi i set di risultati .
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
Il risultato finale includerà la serie con tutti gli intervalli di 5 minuti anche quelli che non hanno valori.
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
L'intervallo può essere facilmente modificato regolando l'ultimo parametro di generate_series. Nel nostro caso usiamo "5m" ma potrebbe essere qualsiasi intervallo desideriamo.