PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Selecionando uma média de registros agrupados por períodos 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


  • A subconsulta grid produz uma linha a cada 5 minutos do mínimo ao máximo de "time" na sua mesa.

  • LEFT JOIN de volta à tabela fatiando os dados em intervalos de 5 minutos. Cuidadosamente inclua borda inferior e excluir borda superior.

  • Para descartar slots de 5 minutos onde nada aconteceu, use JOIN no lugar de LEFT JOIN .

  • Para que seus horários de grade comecem às 0:00, 5:00 etc., arredonde para baixo o min("time") em generate_series() .

Mais explicações nestas respostas relacionadas:
Agrupar por intervalos de dados
PostgreSQL:contagem de linhas em execução para uma consulta 'por minuto'

Além:eu não usaria time como identificador. É uma palavra reservada no SQL padrão e um nome de função/tipo no Postgres.