Pendekatan pertama yang terlintas dalam pikiran adalah menggunakan row_number()
untuk membubuhi keterangan tabel, lalu kelompokkan menurut blok 16 baris.
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;
Perhatikan bahwa ini tidak harus menyertakan 16 sampel untuk grup terakhir.
Sebagai alternatif, Anda dapat menghitung rata-rata berjalan dengan menggunakan avg()
sebagai fungsi jendela:
SELECT id, avg(rainfall) OVER (ORDER BY id ROWS 15 PRECEDING)
FROM the_table;
... mungkin membubuhi keterangan itu dengan nomor baris dan memilih yang Anda inginkan:
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;
Ini akan mengabaikan n<16 sampel terakhir, tidak mengembalikan satu baris untuk mereka.
Perhatikan bahwa saya berasumsi ID tidak dijamin bersebelahan. Jika mereka tidak memiliki celah, Anda cukup group by id/16
dan hindari fungsi jendela.