Saya menemukan masalah yang sama.
Saya menemukan bahwa itu adalah mudah untuk kelompok dengan interval menit hanya membagi zaman oleh menit dalam jumlah detik dan kemudian pembulatan atau menggunakan lantai untuk mendapatkan tumpangan dari sisanya. Jadi jika Anda ingin mendapatkan interval dalam 5 menit Anda akan menggunakan 300 detik .
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
Ini akan mengembalikan data dengan benar dikelompokkan dengan interval menit yang dipilih; namun, ini tidak akan mengembalikan interval yang tidak berisi data apa pun. Untuk mendapatkan interval kosong tersebut kita bisa menggunakan fungsi generate_series .
SELECT generate_series(MIN(date_trunc('hour',timestamp_column)),
max(date_trunc('minute',timestamp_column)),'5m') as interval_alias FROM
TABLE_NAME
Hasil:
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
Sekarang untuk mendapatkan hasil dengan interval dengan kejadian nol kita hanya menggabungkan kedua kumpulan hasil .
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
Hasil akhirnya akan menyertakan rangkaian dengan semua interval 5 menit bahkan yang tidak memiliki nilai.
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
Interval dapat dengan mudah diubah dengan menyesuaikan parameter terakhir dari generate_series. Dalam kasus kami, kami menggunakan '5m' tetapi bisa jadi interval apa pun yang kami inginkan.