sql >> Databáze >  >> RDS >> PostgreSQL

Postgresql SQL GROUP BY časový interval s libovolnou přesností (až na milisekundy)

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;


  1. SQL Server:Jak vybrat všechny dny v rozsahu dat, i když pro některé dny neexistují žádná data

  2. Dotaz k odstranění jedinečného nebo primárního klíče z tabulky MYsql

  3. Operátor SQL AND pro začátečníky

  4. Vyhněte se této běžné chybě při provádění uložené procedury v MS Access