sql >> Databasteknik >  >> RDS >> PostgreSQL

Välja ett genomsnitt av poster grupperade efter 5 minuters perioder

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ör LEFT JOIN .

  • För att få dina rutnätstider att börja kl. 0:00, 5:00 etc, runda ned min("time") i generate_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.



  1. Openshift, kan inte ansluta till Mysql från konsolen

  2. Saknade artefakt com.oracle:ojdbc6:jar:11.2.0.3

  3. Så här infogar du ett nytt ID för automatisk ökning

  4. Kodningsfel med sqlalchemy och postgresql