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.
J'insiste sur moi.
Cela utilise la fonction d'agrégation personnalisée array_combine(anyarray)
fourni par a_horse
.
Ou ici :
- Sélectionner des données dans un tableau Postgres
- Existe-t-il quelque chose comme une fonction zip() dans PostgreSQL qui combine deux tableaux ?