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 diLEFT JOIN
. -
Per fare in modo che i tempi della griglia inizino alle 0:00, 5:00 ecc., arrotonda per difetto il
min("time")
ingenerate_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.