Una funzione finestra con una funzione personalizzata cornice rende questo sorprendentemente semplice :
SELECT ts
,avg(val) OVER (ORDER BY ts
ROWS BETWEEN CURRENT ROW AND 7 FOLLOWING) AS avg_8h
FROM tbl;
Il frame per ogni media è la riga corrente più il seguente 7. Ciò presuppone che tu abbia esattamente una riga per ogni ora. I tuoi dati di esempio sembrano implicare questo, ma non l'hai specificato.
Così com'è, avg_8h
per la finale (secondo ts
) 7 righe dell'insieme vengono calcolate con un numero inferiore di righe, finché il valore dell'ultima riga non è uguale alla propria media. Non hai specificato come trattare il caso speciale.