Anda dapat membuat tabel "bucket" dengan menambahkan interval yang dibuat oleh generate_series(). Pernyataan SQL ini akan menghasilkan tabel ember lima menit untuk hari pertama (nilai min(measured_at)
) di data Anda.
select
(select min(measured_at)::date from measurements) + ( n || ' minutes')::interval start_time,
(select min(measured_at)::date from measurements) + ((n+5) || ' minutes')::interval end_time
from generate_series(0, (24*60), 5) n
Bungkus itu pernyataan dalam ekspresi tabel umum, dan Anda dapat bergabung dan mengelompokkannya seolah-olah itu adalah tabel dasar.
with five_min_intervals as (
select
(select min(measured_at)::date from measurements) + ( n || ' minutes')::interval start_time,
(select min(measured_at)::date from measurements) + ((n+5) || ' minutes')::interval end_time
from generate_series(0, (24*60), 5) n
)
select f.start_time, f.end_time, avg(m.val) avg_val
from measurements m
right join five_min_intervals f
on m.measured_at >= f.start_time and m.measured_at < f.end_time
group by f.start_time, f.end_time
order by f.start_time
Pengelompokan menurut jumlah detik yang berubah-ubah serupa--gunakan date_trunc()
.
Penggunaan generate_series() yang lebih umum memungkinkan Anda menghindari menebak batas atas untuk ember lima menit. Dalam praktiknya, Anda mungkin akan membangun ini sebagai tampilan atau fungsi. Anda mungkin mendapatkan kinerja yang lebih baik dari tabel dasar.
select
(select min(measured_at)::date from measurements) + ( n || ' minutes')::interval start_time,
(select min(measured_at)::date from measurements) + ((n+5) || ' minutes')::interval end_time
from generate_series(0, ((select max(measured_at)::date - min(measured_at)::date from measurements) + 1)*24*60, 5) n;