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;
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.