sql >> Databáze >  >> RDS >> PostgreSQL

seskupení každých N hodnot

První přístup, který přichází na mysl, je použití row_number() anotovat tabulku, pak seskupit bloky po 16 řádcích.

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;

Upozorňujeme, že to nemusí nutně zahrnovat 16 vzorků pro poslední skupinu.

Alternativně můžete vypočítat průběžný průměr pomocí avg() jako funkce okna:

SELECT id, avg(rainfall) OVER (ORDER BY id ROWS 15 PRECEDING)
FROM the_table;

... případně to označte číslem řádku a vyberte ty, které chcete:

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;

Toto bude ignorovat posledních n<16 vzorků a nevrátí pro ně řádek.

Všimněte si, že předpokládám, že není zaručeno, že ID budou sousedit. Pokud jsou bez mezer, můžete je jednoduše group by id/16 a vyhněte se funkci okna.



  1. vybrat a počítat řádky

  2. mysql select s více n až n

  3. GitHub Commit Error:Oprávnění odepřeno Závažné:Nelze zpracovat cestu ~/App_Data/aspnet-MyProject.mdf

  4. Jak namapuji na a ze složitého typu v kódu EF4.3 jako první?