PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Aggregierte Werte über einen Zeitraum von Stunden, jede Stunde

Eine Fensterfunktion mit einer benutzerdefinierten Rahmen macht dies verblüffend einfach :

SELECT ts
      ,avg(val) OVER (ORDER BY ts
                      ROWS BETWEEN CURRENT ROW AND 7 FOLLOWING) AS avg_8h
FROM tbl;

Live-Demo auf sqlfiddle.

Der Rahmen für jeden Durchschnitt ist die aktuelle Zeile plus die folgenden 7. Dies setzt voraus, dass Sie genau eine Zeile für jede Stunde haben. Ihre Beispieldaten scheinen dies zu implizieren, aber Sie haben es nicht angegeben.

So wie es ist, avg_8h für das Finale (laut ts ) 7 Zeilen des Satzes werden mit weniger Zeilen berechnet, bis der Wert der letzten Zeile gleich ihrem eigenen Durchschnitt ist. Sie haben nicht angegeben, wie mit dem Sonderfall umgegangen werden soll.