PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wybór średniej rekordów pogrupowanych co 5 minut

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;

Wyjaśnij

  • Podzapytanie grid tworzy jeden wiersz na każde 5 minut od minimum do maksimum „time" w twoim stole.

  • LEFT JOIN z powrotem do tabeli dzielenia danych w 5-minutowych odstępach. Ostrożnie uwzględnij dolna ramka i wyklucz górna granica.

  • Aby upuścić 5-minutowe przedziały, w których nic się nie stało, użyj JOIN w miejsce LEFT JOIN .

  • Aby czasy siatki zaczynały się o godzinie 0:00, 5:00 itd., zaokrąglij w dół min("time") w generate_series() .

Więcej wyjaśnień w tych powiązanych odpowiedziach:
Grupuj według interwały danych
PostgreSQL:liczenie wierszy dla zapytania 'w minutach'

Poza tym:nie użyłbym time jako identyfikator. To zastrzeżone słowo w standardowym SQL oraz nazwę funkcji/typu w Postgresie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę wstawić obiekt JSON do Postgresa za pomocą przygotowanego Javy?

  2. Tworzenie użytkownika z zaszyfrowanym hasłem w PostgreSQL

  3. pg_dump:nieprawidłowa opcja -- i podczas migracji

  4. Pobieranie najpopularniejszych słów kluczowych z kolumny tsvector

  5. Jak modelować klaster pracy awaryjnej PostgreSQL za pomocą Docker/Kubernetes?