PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Valeurs agrégées sur une plage d'heures, toutes les heures

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;

Démo en direct sur sqlfiddle.

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.