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;
Vysvětlete
-
Poddotaz
grid
vytvoří jeden řádek každých 5 minut od minima po maximum "time"
ve vaší tabulce. -
VLEVO JOIN zpět ke stolu krájení dat v 5minutových intervalech. Pečlivě zahrňte dolní okraj a vyloučit horní okraj.
-
Chcete-li vypustit 5minutové bloky, kde se nic nestalo, použijte
JOIN
místoLEFT JOIN
. -
Chcete-li, aby časy mřížky začínaly v 0:00, 5:00 atd., zaokrouhlete dolů
min("time")
vgenerate_series()
.
Další vysvětlení v těchto souvisejících odpovědích:
Seskupit podle datové intervaly
PostgreSQL:průběžný počet řádků pro dotaz „po minutách“
Stranou:nepoužil bych time
jako identifikátor. Je to rezervované slovo ve standardním SQL
a název funkce / typu v Postgres.