In Postgres 11 oder höher verwenden Sie ein Fenster Funktion mit einem benutzerdefinierten Frame und einem frame_exclusion
:
SELECT *, array_combine(values) OVER (ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
EXCLUDE CURRENT ROW) AS agg_values
FROM tbl;
Wenn name
ist nicht UNIQUE
, und da du gefragt hast:
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
Der erste arbeitet (auch) mit einer beliebigen Reihenfolge der Zeilen, nur mit Ausnahme der aktuellen. Die zweite erfordert ORDER BY
um festzustellen, welche Zeilen in derselben Gruppe sind.
Fettdruck von mir.
Dies verwendet die benutzerdefinierte Aggregatfunktion array_combine(anyarray)
bereitgestellt von a_horse
.
Oder hier:
- Auswahl von Daten in einem Postgres-Array
- Gibt es in PostgreSQL so etwas wie eine zip()-Funktion, die zwei Arrays kombiniert?