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;
Explicar
-
La subconsulta
grid
produce una fila por cada 5 minutos desde el mínimo hasta el máximo de "time"
en tu mesa. -
LEFT JOIN vuelve a la tabla cortando datos en intervalos de 5 minutos. Cuidadosamente incluir borde inferior y excluir borde superior.
-
Para soltar espacios de 5 minutos donde no pasó nada, use
JOIN
en lugar deLEFT JOIN
. -
Para que sus tiempos de cuadrícula comiencen a las 0:00, 5:00, etc., redondee hacia abajo el
min("time")
engenerate_series()
.
Más explicaciones en estas respuestas relacionadas:
Grupo por intervalos de datos
PostgreSQL:conteo continuo de filas para una consulta 'por minuto'
Aparte:no usaría time
como identificador. Es una palabra reservada en SQL estándar
y un nombre de función/tipo en Postgres.