Tabulku "bucketů" můžete vygenerovat přidáním intervalů vytvořených pomocí create_series(). Tento příkaz SQL vygeneruje tabulku pětiminutových segmentů pro první den (hodnota min(measured_at)
) ve vašich datech.
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
Zabalte to ve společném tabulkovém výrazu a můžete se k němu připojit a seskupovat, jako by to byla základní tabulka.
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
Seskupení podle libovolného počtu sekund je podobné – použijte date_trunc()
.
Obecnější použití create_series() vám umožní vyhnout se hádání horní hranice pro pětiminutové segmenty. V praxi byste to pravděpodobně vytvořili jako pohled nebo funkci. Můžete získat lepší výkon ze základní tabulky.
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;