PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Aggregieren aller Werte, die sich nicht in derselben Gruppe befinden

In Postgres 11 oder höher verwenden Sie ein Fenster Funktion mit einem benutzerdefinierten Frame und einem frame_exclusion :

SELECT *, array_combine(values) OVER (ROWS BETWEEN UNBOUNDED PRECEDING
                                           AND UNBOUNDED FOLLOWING
                                           EXCLUDE CURRENT ROW) AS agg_values
FROM   tbl;

Wenn name ist nicht UNIQUE , und da du gefragt hast:

SELECT *, array_combine(values) OVER (ORDER BY name
                                      ROWS BETWEEN UNBOUNDED PRECEDING
                                           AND UNBOUNDED FOLLOWING
                                           EXCLUDE GROUP) AS agg_values
FROM   tbl;

db<>fiddle hier

Der erste arbeitet (auch) mit einer beliebigen Reihenfolge der Zeilen, nur mit Ausnahme der aktuellen. Die zweite erfordert ORDER BY um festzustellen, welche Zeilen in derselben Gruppe sind.

Das Handbuch:

Fettdruck von mir.

Dies verwendet die benutzerdefinierte Aggregatfunktion array_combine(anyarray) bereitgestellt von a_horse .
Oder hier: