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;
Förklara
-
Underfrågan
grid
producerar en rad för var 5:e minut från minimum till maximum av "time"
i din tabell. -
VÄNSTER JOIN tillbaka till tabellen skiva data i 5-minutersintervaller. inkludera försiktigt nedre kant och uteslut övre kant.
-
Använd
JOIN
för att tappa 5-min-luckor där inget hände i stället förLEFT JOIN
. -
För att få dina rutnätstider att börja kl. 0:00, 5:00 etc, runda ned
min("time")
igenerate_series()
.
Mer förklaring i dessa relaterade svar:
Gruppera efter dataintervall
PostgreSQL:körande antal rader för en fråga "per minut"
Bortsett från:Jag skulle inte använda time
som identifierare. Det är ett reserverat ord i standard SQL
och ett funktions-/typnamn i Postgres.