Une fonction de fenêtre avec une cadre rend cela étonnamment simple :
SELECT ts
,avg(val) OVER (ORDER BY ts
ROWS BETWEEN CURRENT ROW AND 7 FOLLOWING) AS avg_8h
FROM tbl;
Le cadre pour chaque moyenne est la ligne actuelle plus les 7 suivantes. Cela suppose que vous avez exactement une ligne pour chaque heure. Votre exemple de données semble impliquer cela, mais vous ne l'avez pas précisé.
Comme c'est, avg_8h
pour la finale (selon ts
) 7 lignes de l'ensemble est calculée avec moins de lignes, jusqu'à ce que la valeur de la dernière ligne soit égale à sa propre moyenne. Vous n'avez pas précisé comment traiter le cas particulier.