No Postgres 11 ou posterior, use uma janela função com um frame personalizado e uma
frame_exclusion
:SELECT *, array_combine(values) OVER (ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
EXCLUDE CURRENT ROW) AS agg_values
FROM tbl;
Se
name
não é UNIQUE
, e já que você perguntou:SELECT *, array_combine(values) OVER (ORDER BY name
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
EXCLUDE GROUP) AS agg_values
FROM tbl;
db<>fiddle aqui
A primeira (também) funciona com ordem arbitrária de linhas, excluindo apenas a atual. O segundo requer
ORDER BY
para estabelecer quais linhas estão no mesmo grupo. O manual:
Minha ênfase em negrito.
Isso usa a função agregada personalizada
array_combine(anyarray)
fornecido por a_horse
.Ou aqui:
- Selecionando dados em um array Postgres
- Existe algo como uma função zip() no PostgreSQL que combina dois arrays?