Cách tiếp cận đầu tiên mà bạn nghĩ đến là sử dụng row_number()
để chú thích bảng, sau đó nhóm theo khối gồm 16 hàng.
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;
Lưu ý rằng điều này không nhất thiết phải bao gồm 16 mẫu cho nhóm cuối cùng.
Ngoài ra, bạn có thể tính toán trung bình chạy bằng cách sử dụng avg()
như một chức năng cửa sổ:
SELECT id, avg(rainfall) OVER (ORDER BY id ROWS 15 PRECEDING)
FROM the_table;
... có thể chú thích điều đó bằng số hàng và chọn những hàng bạn muốn:
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;
Điều này sẽ bỏ qua n <16 mẫu cuối cùng, không trả lại một hàng cho chúng.
Lưu ý rằng tôi đang giả định rằng các ID không được đảm bảo liền kề. Nếu chúng không có khoảng cách, bạn chỉ có thể group by id/16
và tránh chức năng cửa sổ.