PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Auswählen eines Durchschnitts von Aufzeichnungen, gruppiert nach 5-Minuten-Perioden

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;

Erklären

  • Die Unterabfrage grid erzeugt alle 5 Minuten eine Zeile vom Minimum bis zum Maximum von "time" in Ihrer Tabelle.

  • LEFT JOIN zurück zur Tabelle, die Daten in 5-Minuten-Intervallen aufteilt. Einschließen unteren Rand und ausschließen obere Grenze.

  • Um 5-Minuten-Slots fallen zu lassen, wo nichts passiert ist, verwenden Sie JOIN anstelle von LEFT JOIN .

  • Damit Ihre Rasterzeiten bei 0:00, 5:00 usw. beginnen, runden Sie min("time") ab in generate_series() .

Weitere Erklärungen in diesen verwandten Antworten:
Gruppieren nach Datenintervalle
PostgreSQL:Laufende Anzahl von Zeilen für eine Abfrage "nach Minuten"

Beiseite:Ich würde time nicht verwenden als Kennung. Es ist ein reserviertes Wort in Standard-SQL und einen Funktions-/Typnamen in Postgres.