U kunt een tabel met "buckets" genereren door intervallen toe te voegen die zijn gemaakt door Genereer_series(). Deze SQL-instructie genereert een tabel met buckets van vijf minuten voor de eerste dag (de waarde van min(measured_at)
) in uw gegevens.
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
Wikkel dat statement in een gemeenschappelijke tabeluitdrukking, en u kunt eraan deelnemen en groeperen alsof het een basistabel is.
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
Groeperen op een willekeurig aantal seconden is vergelijkbaar:gebruik date_trunc()
.
Een meer algemeen gebruik van Genereer_series() zorgt ervoor dat u de bovengrens voor buckets van vijf minuten niet hoeft te raden. In de praktijk zou je dit waarschijnlijk als een weergave of een functie bouwen. U krijgt mogelijk betere prestaties van een basistabel.
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;