PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

agrupando todos os N valores


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.