En vinduefunktion med en brugerdefineret ramme gør dette utroligt enkelt :
SELECT ts
,avg(val) OVER (ORDER BY ts
ROWS BETWEEN CURRENT ROW AND 7 FOLLOWING) AS avg_8h
FROM tbl;
Rammen for hvert gennemsnit er den aktuelle række plus de følgende 7. Dette forudsætter, at du har præcis én række for hver time. Dine eksempeldata lader til at antyde det, men du har ikke specificeret.
Sådan er det, avg_8h
til finalen (ifølge ts
) 7 rækker af sættet beregnes med færre rækker, indtil værdien af den sidste række er lig med sit eget gennemsnit. Du har ikke angivet, hvordan du skal håndtere den særlige sag.