sql >> Database >  >> RDS >> PostgreSQL

Een gemiddelde van records selecteren, gegroepeerd op perioden van 5 minuten

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;

Uitleggen

  • De subquery grid produceert één rij voor elke 5 minuten van het minimum tot het maximum van "time" in uw tafel.

  • LEFT JOIN terug naar de tabel die gegevens snijdt in intervallen van 5 minuten. Zorgvuldig opnemen onderrand en uitsluiten bovenrand.

  • Gebruik JOIN . om 5-min-slots te laten vallen waar niets gebeurde in plaats van LEFT JOIN .

  • Om uw starttijden om 0:00, 5:00 etc. te laten beginnen, rondt u de min("time") af naar beneden in generate_series() .

Meer uitleg in deze gerelateerde antwoorden:
Groep op data-intervallen
PostgreSQL:lopende telling van rijen voor een zoekopdracht 'per minuut'

Terzijde:ik zou geen time gebruiken als identificatie. Het is een gereserveerd woord in standaard SQL en een functie / typenaam in Postgres.



  1. Rails:aanroepen van .limit(5) verandert de volgorde van de resultaten

  2. Hoe voeg je twee tabellen mysql samen?

  3. Geen geheugen (toegewezen 50855936) (geprobeerd om 50331646 bytes toe te wijzen)

  4. Liquibase beheren met GitFlow-ontwikkelingsmodel