頭に浮かぶ最初のアプローチは、row_number()
を使用することです。 テーブルに注釈を付けてから、16行のブロックでグループ化します。
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;
これには、最後のグループの16個のサンプルが含まれるとは限らないことに注意してください。
または、移動平均を計算することもできます。 avg()
を使用する ウィンドウ関数として:
SELECT id, avg(rainfall) OVER (ORDER BY id ROWS 15 PRECEDING)
FROM the_table;
...行番号で注釈を付け、必要なものを選択する可能性があります:
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;
これにより、最後のn <16サンプルは無視され、行は返されません。
IDが連続していることが保証されていないことを前提としていることに注意してください。ギャップがない場合は、group by id/16
するだけです。 窓関数は避けてください。