sql >> Base de Datos >  >> RDS >> PostgreSQL

Agregar todos los valores que no están en el mismo grupo

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.

El manual:

Énfasis en negrita mío.

Esto utiliza la función agregada personalizada array_combine(anyarray) proporcionado por a_horse .
O aquí: