I Postgres 11 eller senere, brug et vindue funktion med en brugerdefineret ramme og en frame_exclusion
:
SELECT *, array_combine(values) OVER (ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
EXCLUDE CURRENT ROW) AS agg_values
FROM tbl;
Hvis name
er ikke UNIQUE
, og da du spurgte:
SELECT *, array_combine(values) OVER (ORDER BY name
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
EXCLUDE GROUP) AS agg_values
FROM tbl;
db<>fiddle her
Den første fungerer (også) med vilkårlig rækkefølge af rækker, kun eksklusive den nuværende. Den anden kræver ORDER BY
for at fastslå, hvilke rækker der er i samme gruppe.
Fed fremhævelse mine.
Dette bruger den tilpassede aggregerede funktion array_combine(anyarray)
leveret af a_horse
.
Eller her:
- Valg af data i en Postgres-array
- Er der noget som en zip()-funktion i PostgreSQL, der kombinerer to arrays?