PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Selezione di una media di record raggruppati per periodi di 5 minuti

SELECT grid.t5
      ,min(t."time") AS min_time
--    ,array_agg(extract(min FROM t."time")) AS 'players_on' -- optional
      ,avg(t.players) AS avg_players
      ,avg(t.servers) AS avg_servers
FROM (
   SELECT generate_series(min("time")
                         ,max("time"), interval '5 min') AS t5
   FROM tbl
   ) grid
LEFT JOIN tbl t ON t."time" >= grid.t5
               AND t."time" <  grid.t5 +  interval '5 min'
GROUP  BY grid.t5
ORDER  BY grid.t5;

Spiega

  • La sottoquery grid produce una riga ogni 5 minuti dal minimo al massimo di "time" nella tua tabella.

  • LEFT JOIN torna alla tabella per affettare i dati a intervalli di 5 minuti. includi con attenzione bordo inferiore ed escludi bordo superiore.

  • Per eliminare slot di 5 minuti in cui non è successo nulla, utilizza JOIN al posto di LEFT JOIN .

  • Per fare in modo che i tempi della griglia inizino alle 0:00, 5:00 ecc., arrotonda per difetto il min("time") in generate_series() .

Maggiori spiegazioni in queste risposte correlate:
Raggruppa per intervalli di dati
PostgreSQL:conteggio in esecuzione delle righe per una query 'per minuto'

A parte:non userei time come identificatore. È una parola riservata nell'SQL standard e un nome di funzione/tipo in Postgres.