sql >> Base de Datos >  >> RDS >> PostgreSQL

Selección de un promedio de registros agrupados por periodos de 5 minutos

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 de LEFT JOIN .

  • Para que sus tiempos de cuadrícula comiencen a las 0:00, 5:00, etc., redondee hacia abajo el min("time") en generate_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.