sql >> Database teknologi >  >> RDS >> PostgreSQL

Valg af et gennemsnit af poster grupperet efter 5 minutters 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;

Forklar

  • Underforespørgslen grid producerer en række for hvert 5. minut fra minimum til maksimum af "time" i din tabel.

  • VENSTRE JOIN tilbage til tabellen udskæringsdata i 5-minutters intervaller. inkluder omhyggeligt nederste kant og ekskluder øvre kant.

  • For at droppe 5-min-slots, hvor der ikke skete noget, skal du bruge JOIN i stedet for LEFT JOIN .

  • For at få dine gittertider til at starte kl. 0:00, 5:00 osv. skal du runde ned min("time") i generate_series() .

Mere forklaring i disse relaterede svar:
Gruppér efter dataintervaller
PostgreSQL:kørende antal rækker for en forespørgsel 'efter minut'

Bortset fra:Jeg ville ikke bruge time som identifikator. Det er et reserveret ord i standard SQL og et funktions-/typenavn i Postgres.



  1. php-session vs mysql-hastighed

  2. oprettelse af en forbindelse i eclipse - ClassNotFoundException:com.mysql.jdbc.Driver

  3. Oracle og paginering

  4. Postgresql create extension mislykkes