PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Aggregazione di tutti i valori non nello stesso gruppo

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.

Il manuale:

Enfasi in grassetto la mia.

Questo utilizza la funzione di aggregazione personalizzata array_combine(anyarray) fornito da a_horse .
O qui: