sql >> Database >  >> RDS >> PostgreSQL

Postgresql SQL GROUP BY tijdsinterval met willekeurige nauwkeurigheid (tot milliseconden)

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;


  1. Gegevensmaskering in DB-toepassingen

  2. Uitzondering ORA-08103:object bestaat niet meer bij gebruik van setfetchsize van Hibernate

  3. Verwijder of trim de eerste of laatste paar tekens in MySQL-database met SQL

  4. Is de volgorde van tabellen in een join van belang, wanneer LEFT (outer) joins worden gebruikt?