I Postgres 11 eller senare, använd ett fönster funktion med en anpassad ram och en frame_exclusion
:
SELECT *, array_combine(values) OVER (ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
EXCLUDE CURRENT ROW) AS agg_values
FROM tbl;
Om name
är inte UNIQUE
, och eftersom du frågade:
SELECT *, array_combine(values) OVER (ORDER BY name
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
EXCLUDE GROUP) AS agg_values
FROM tbl;
db<>fiol här
Den första fungerar (också) med godtycklig ordning av rader, endast exklusive den nuvarande. Den andra kräver ORDER BY
för att fastställa vilka rader som finns i samma grupp.
Djärv betoning min.
Detta använder den anpassade aggregatfunktionen array_combine(anyarray)
tillhandahålls av a_horse
.
Eller här:
- Välja data i en Postgres-array
- Finns det något liknande en zip()-funktion i PostgreSQL som kombinerar två arrayer?