Una función de ventana con un marco hace esto increíblemente simple :
SELECT ts
,avg(val) OVER (ORDER BY ts
ROWS BETWEEN CURRENT ROW AND 7 FOLLOWING) AS avg_8h
FROM tbl;
Demostración en vivo en sqlfiddle.
El marco para cada promedio es la fila actual más las 7 siguientes. Esto supone que tiene exactamente una fila para cada hora. Sus datos de muestra parecen implicar eso, pero no lo especificó.
Tal como es, avg_8h
para la final (según ts
) 7 filas del conjunto se calculan con menos filas, hasta que el valor de la última fila es igual a su propio promedio. No especificó cómo tratar el caso especial.