PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Agregando todos os valores que não estão no mesmo grupo


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: