sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgresql SQL GROUP BY tidsintervall med godtycklig noggrannhet (ned till millisekunder)

Du kan generera en tabell med "buckets" genom att lägga till intervall skapade av gener_series(). Denna SQL-sats genererar en tabell med fem-minuters hinkar för den första dagen (värdet min(measured_at) ) i dina data.

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

Slå in det sats i ett vanligt tabelluttryck, och du kan gå med och gruppera på det som om det vore en bastabell.

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

Gruppering efter ett godtyckligt antal sekunder är liknande - använd date_trunc() .

En mer allmän användning av gener_series() låter dig undvika att gissa den övre gränsen för fem-minuters hinkar. I praktiken skulle du förmodligen bygga detta som en vy eller en funktion. Du kanske får bättre prestanda från en bastabell.

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. 5 mycket vanliga SQL-frågor design misstag att undvika till varje pris

  2. Infoga SQL Server-data med Oracle® SQL*Loader

  3. mysql2 pärla kompilerad för fel mysql-klientbibliotek

  4. Hur bygger man en kolvapplikation runt en redan befintlig databas?