it-swarm.com.de

Array_agg und unnest kombinieren

Gegeben ein Datensatz (mit einem GIN Index für values):

key | values
-------------
 1  | {4,2,1}
 1  | {2,5}
 2  | {4,1,3}

Ich möchte die Arrays zusammenfassen:

key | values
-------------
 1  | {4,2,1,5}
 2  | {4,1,3}

Mein erster Gedanke hat nicht funktioniert:

SELECT key, array_agg(DISTINCT unnest(values)) AS values FROM data GROUP BY key

FEHLER: Aggregierte Funktionsaufrufe können keine Set-Return-Funktionsaufrufe enthalten
Hinweis: Möglicherweise können Sie die Set-Return-Funktion in ein LATERAL FROM-Element verschieben.

Nicht vertraut sein mit LATERAL FROM, es ist mir nicht klar, wie ich die gewünschte Ausgabe erzielen kann.

3
OrangeDog

Sie müssen das Unnest in einer Unterabfrage tun:

select d."key", array_agg(distinct x.v) 
from data d
  cross join lateral unnest(d."values") as x(v)
group by d."key";

Set-Return-Funktionen (wie unnest()) sollten im Allgemeinen im from -Teil einer Abfrage verwendet werden. Um jedoch auf eine Spalte aus der Tabelle verweisen zu können, benötigen Sie eine laterale Verknüpfung .

from data cross join lateral unnest(...) ist eine explizite Schreibweise from data, unnest(...), die auch eine Querverbindung erzeugt. Ich bevorzuge jedoch den expliziten Operator cross join, Um zu dokumentieren, dass ich tatsächlich beabsichtigt habe, einen Cross-Join zu schreiben, anstatt versehentlich.

Dadurch wird jedoch die Reihenfolge der Elemente nicht beibehalten.

Online-Beispiel: https://rextester.com/TVIDB57711