sql >> Databáze >  >> RDS >> PostgreSQL

Výběr průměru záznamů seskupených podle 5minutových období

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;

Vysvětlete

  • Poddotaz grid vytvoří jeden řádek každých 5 minut od minima po maximum "time" ve vaší tabulce.

  • VLEVO JOIN zpět ke stolu krájení dat v 5minutových intervalech. Pečlivě zahrňte dolní okraj a vyloučit horní okraj.

  • Chcete-li vypustit 5minutové bloky, kde se nic nestalo, použijte JOIN místo LEFT JOIN .

  • Chcete-li, aby časy mřížky začínaly v 0:00, 5:00 atd., zaokrouhlete dolů min("time") v generate_series() .

Další vysvětlení v těchto souvisejících odpovědích:
Seskupit podle datové intervaly
PostgreSQL:průběžný počet řádků pro dotaz „po minutách“

Stranou:nepoužil bych time jako identifikátor. Je to rezervované slovo ve standardním SQL a název funkce / typu v Postgres.



  1. UnicodeEncodeError:Kodek 'latin-1' nemůže kódovat znak

  2. Data uložena dvakrát v databázi MySQL. Nevíte, co dělám špatně?

  3. Formátování SQL v SQL Server Management Studio

  4. Java a MySql nastavují znaky unicode pro tuto třídu