En Postgres 11 o posterior, use una ventana función con un marco personalizado y un frame_exclusion
:
SELECT *, array_combine(values) OVER (ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
EXCLUDE CURRENT ROW) AS agg_values
FROM tbl;
Si name
no es UNIQUE
, y ya que preguntaste:
SELECT *, array_combine(values) OVER (ORDER BY name
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
EXCLUDE GROUP) AS agg_values
FROM tbl;
db<>fiddle aquí
El primero (también) funciona con un orden arbitrario de filas, solo excluyendo el actual. El segundo requiere ORDER BY
para establecer qué filas están en el mismo grupo.
Énfasis en negrita mío.
Esto utiliza la función agregada personalizada array_combine(anyarray)
proporcionado por a_horse
.
O aquí:
- Seleccionar datos en una matriz de Postgres
- ¿Existe algo como una función zip() en PostgreSQL que combine dos matrices?