En fönsterfunktion med en anpassad ram gör detta otroligt enkelt :
SELECT ts
,avg(val) OVER (ORDER BY ts
ROWS BETWEEN CURRENT ROW AND 7 FOLLOWING) AS avg_8h
FROM tbl;
Ramen för varje medelvärde är den aktuella raden plus följande 7. Detta förutsätter att du har exakt en rad för varje timme. Dina exempeldata verkar antyda det, men du har inte angett det.
Som det är, avg_8h
för finalen (enligt ts
) 7 rader av uppsättningen beräknas med färre rader, tills värdet på den sista raden är lika med dess eget medelvärde. Du angav inte hur du skulle hantera specialfallet.