PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

regroupant toutes les N valeurs

La 1ère approche qui me vient à l'esprit est d'utiliser row_number() pour annoter le tableau, puis regrouper par blocs de 16 lignes.

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;

Notez que cela n'inclura pas nécessairement 16 échantillons pour le dernier groupe.

Vous pouvez également calculer une moyenne courante en utilisant avg() comme fonction de fenêtre :

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

... en annotant éventuellement cela avec le numéro de ligne et en sélectionnant ceux que vous voulez :

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;

Cela ne tiendra pas compte des n<16 derniers échantillons et ne renverra pas de ligne pour eux.

Notez que je suppose que les identifiants ne sont pas garantis contigus. S'ils sont sans espace, vous pouvez simplement group by id/16 et évitez la fonction fenêtre.