PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Gruppieren aller N Werte

Der erste Ansatz, der mir in den Sinn kommt, ist die Verwendung von row_number() um die Tabelle mit Anmerkungen zu versehen, dann gruppieren Sie nach Blöcken von 16 Zeilen.

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;

Beachten Sie, dass dies nicht unbedingt 16 Samples für die letzte Gruppe enthält.

Alternativ können Sie einen laufenden Durchschnitt berechnen indem Sie avg() verwenden als Fensterfunktion:

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

... eventuell mit der Zeilennummer kommentieren und die gewünschten auswählen:

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;

Dadurch werden die letzten n<16 Samples ignoriert und keine Zeile für sie zurückgegeben.

Beachten Sie, dass ich davon ausgehe, dass die IDs nicht unbedingt zusammenhängend sind. Wenn sie lückenlos sind, können Sie einfach group by id/16 und vermeiden Sie die Fensterfunktion.