Pierwszym podejściem, które przychodzi mi do głowy, jest użycie row_number()
aby opisać tabelę, a następnie pogrupuj blokami po 16 wierszy.
SELECT min(id) as first_id, max(id) AS last_id, avg(rainfall) AS avg_this_16
FROM (
SELECT id, rainfall, row_number() OVER (order by id) AS n
FROM the_table
) x(id,rainfall,n)
GROUP BY n/16
ORDER BY n/16;
Pamiętaj, że nie musi to obejmować 16 próbek dla ostatniej grupy.
Alternatywnie możesz obliczyć średnią bieżącą za pomocą avg()
jako funkcja okna:
SELECT id, avg(rainfall) OVER (ORDER BY id ROWS 15 PRECEDING)
FROM the_table;
... ewentualnie opisując to numerem wiersza i wybierając te, które chcesz:
SELECT id AS greatest_id_in_group, avg_last_16_inclusive FROM (
SELECT
id,
avg(rainfall) OVER (ORDER BY id ROWS 15 PRECEDING) AS avg_last_16_inclusive,
row_number() OVER (ORDER BY id) AS n
FROM the_table
) x WHERE n % 16 = 0;
To zignoruje ostatnie n<16 próbek, nie zwracając dla nich wiersza.
Pamiętaj, że zakładam, że nie ma gwarancji, że identyfikatory będą ciągłe. Jeśli są bez przerw, możesz po prostu group by id/16
i unikaj funkcji okna.