In Postgres 11 o successivo, usa una finestra funzione con un frame personalizzato e un frame_exclusion
:
SELECT *, array_combine(values) OVER (ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
EXCLUDE CURRENT ROW) AS agg_values
FROM tbl;
Se name
non è UNIQUE
, e poiché hai chiesto:
SELECT *, array_combine(values) OVER (ORDER BY name
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
EXCLUDE GROUP) AS agg_values
FROM tbl;
db<>violino qui
Il primo (anche) funziona con un ordine arbitrario delle righe, escludendo solo quello corrente. Il secondo richiede ORDER BY
per stabilire quali righe sono nello stesso gruppo.
Enfasi in grassetto la mia.
Questo utilizza la funzione di aggregazione personalizzata array_combine(anyarray)
fornito da a_horse
.
O qui:
- Selezione dei dati in un array Postgres
- C'è qualcosa come una funzione zip() in PostgreSQL che combina due array?