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

Agrégation de toutes les valeurs n'appartenant pas au même groupe

Dans Postgres 11 ou version ultérieure, utilisez une fenêtre fonction avec un cadre personnalisé et un frame_exclusion :

SELECT *, array_combine(values) OVER (ROWS BETWEEN UNBOUNDED PRECEDING
                                           AND UNBOUNDED FOLLOWING
                                           EXCLUDE CURRENT ROW) AS agg_values
FROM   tbl;

Si name n'est pas UNIQUE , et puisque vous avez demandé :

SELECT *, array_combine(values) OVER (ORDER BY name
                                      ROWS BETWEEN UNBOUNDED PRECEDING
                                           AND UNBOUNDED FOLLOWING
                                           EXCLUDE GROUP) AS agg_values
FROM   tbl;

db<>violon ici

Le premier fonctionne (également) avec un ordre arbitraire de lignes, en excluant uniquement l'actuel. La seconde nécessite ORDER BY pour déterminer quelles lignes se trouvent dans le même groupe.

Le manuel :

J'insiste sur moi.

Cela utilise la fonction d'agrégation personnalisée array_combine(anyarray) fourni par a_horse .
Ou ici :