sql >> Database >  >> RDS >> PostgreSQL

elke N-waarden groeperen

De eerste benadering die in je opkomt is het gebruik van row_number() om de tabel te annoteren en groepeer vervolgens in blokken van 16 rijen.

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;

Merk op dat dit niet noodzakelijkerwijs 16 voorbeelden voor de laatste groep omvat.

Als alternatief kunt u een lopend gemiddelde berekenen door avg() . te gebruiken als vensterfunctie:

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

... eventueel annoteren met het rijnummer en degene die je wilt selecteren:

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;

Dit zal de laatste n<16 samples negeren en er geen rij voor teruggeven.

Merk op dat ik aanneem dat de ID's niet gegarandeerd aaneengesloten zijn. Als ze geen gaten hebben, kun je gewoon group by id/16 en vermijd de vensterfunctie.



  1. MySQL - Een kolom selecteren die niet in Group By is

  2. Hoe twee django-modellen (tabellen) samen te voegen tot één model (tabel)

  3. Controleer of een tabel een externe sleutel heeft in SQL Server met OBJECTPROPERTY()

  4. Lightswitch staat het toevoegen of wijzigen van records in MySQL niet toe