A primeira abordagem que vem à mente é usar
row_number()
para anotar a tabela, então agrupe por blocos de 16 linhas. 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;
Observe que isso não incluirá necessariamente 16 amostras para o último grupo.
Como alternativa, você pode calcular uma média de execução usando
avg()
como uma função de janela:SELECT id, avg(rainfall) OVER (ORDER BY id ROWS 15 PRECEDING)
FROM the_table;
... possivelmente anotando isso com o número da linha e selecionando as que você deseja:
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;
Isso desconsiderará as últimas n<16 amostras, não retornando uma linha para elas.
Observe que estou assumindo que os IDs não são garantidos como contíguos. Se eles não tiverem espaços, você pode apenas
group by id/16
e evite a função de janela.