PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Aggrega i valori in un intervallo di ore, ogni ora

Una funzione finestra con una funzione personalizzata cornice rende questo sorprendentemente semplice :

SELECT ts
      ,avg(val) OVER (ORDER BY ts
                      ROWS BETWEEN CURRENT ROW AND 7 FOLLOWING) AS avg_8h
FROM tbl;

Demo live su sqlfiddle.

Il frame per ogni media è la riga corrente più il seguente 7. Ciò presuppone che tu abbia esattamente una riga per ogni ora. I tuoi dati di esempio sembrano implicare questo, ma non l'hai specificato.

Così com'è, avg_8h per la finale (secondo ts ) 7 righe dell'insieme vengono calcolate con un numero inferiore di righe, finché il valore dell'ultima riga non è uguale alla propria media. Non hai specificato come trattare il caso speciale.