První přístup, který přichází na mysl, je použití row_number()
anotovat tabulku, pak seskupit bloky po 16 řádcích.
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;
Upozorňujeme, že to nemusí nutně zahrnovat 16 vzorků pro poslední skupinu.
Alternativně můžete vypočítat průběžný průměr pomocí avg()
jako funkce okna:
SELECT id, avg(rainfall) OVER (ORDER BY id ROWS 15 PRECEDING)
FROM the_table;
... případně to označte číslem řádku a vyberte ty, které chcete:
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;
Toto bude ignorovat posledních n<16 vzorků a nevrátí pro ně řádek.
Všimněte si, že předpokládám, že není zaručeno, že ID budou sousedit. Pokud jsou bez mezer, můžete je jednoduše group by id/16
a vyhněte se funkci okna.