In Postgres 11 of hoger, gebruik een venster functie met een aangepast frame en een frame_exclusion
:
SELECT *, array_combine(values) OVER (ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
EXCLUDE CURRENT ROW) AS agg_values
FROM tbl;
Als name
is niet UNIQUE
, en aangezien je vroeg:
SELECT *, array_combine(values) OVER (ORDER BY name
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
EXCLUDE GROUP) AS agg_values
FROM tbl;
db<>fiddle hier
De eerste werkt (ook) met een willekeurige volgorde van rijen, alleen met uitzondering van de huidige. De tweede vereist ORDER BY
om vast te stellen welke rijen zich in dezelfde groep bevinden.
Vetgedrukte nadruk van mij.
Dit gebruikt de aangepaste aggregatiefunctie array_combine(anyarray)
geleverd door a_horse
.
Of hier:
- Gegevens selecteren in een Postgres-array
- Is er zoiets als een zip()-functie in PostgreSQL die twee arrays combineert?