sql >> Databasteknik >  >> RDS >> PostgreSQL

gruppera varje N-värde

Den första metoden som kommer att tänka på är att använda row_number() för att kommentera tabellen, gruppera sedan efter block med 16 rader.

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;

Observera att detta inte nödvändigtvis inkluderar 16 prover för den sista gruppen.

Alternativt kan du beräkna ett löpande medelvärde genom att använda avg() som en fönsterfunktion:

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

... eventuellt anteckna det med radnumret och välja de du vill ha:

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;

Detta kommer att bortse från de sista n<16 proven, inte returnera en rad för dem.

Observera att jag antar att id:n inte garanterat är sammanhängande. Om de är fria från luckor kan du bara group by id/16 och undvik fönsterfunktionen.



  1. Minsta värde MySQL-fråga

  2. Hur använder man REGEXP med escape-sekvenser som ordgräns?

  3. Hur skapar man en SQL Server-funktion för att sammanfoga flera rader från en underfråga till ett enda avgränsat fält?

  4. Blandning av MySQL och Mongodb i en applikation