Oracle LISTAGG: Umgang mit doppelten Werten für einzigartige Ergebnisse
Die LISTAGG-Funktion von Oracle ist zwar leistungsstark zum Aggregieren von Daten, entfernt jedoch nicht grundsätzlich doppelte Einträge. Es verkettet alle Werte, einschließlich Wiederholungen, zu einer einzigen Zeichenfolge. So erreichen Sie eine eindeutige Wertaggregation:
Methode für Oracle 19c und höher:
Oracle 19c und spätere Versionen bieten eine vereinfachte Lösung:
<code class="language-sql">SELECT LISTAGG(DISTINCT the_column, ',') WITHIN GROUP (ORDER BY the_column) FROM the_table;</code>
Dadurch wird das Schlüsselwort DISTINCT
direkt in die Funktion LISTAGG
selbst integriert.
Methode für Oracle 18c und früher:
Für ältere Versionen (18c und niedriger) ist eine Unterabfrage erforderlich:
<code class="language-sql">SELECT LISTAGG(the_column, ',') WITHIN GROUP (ORDER BY the_column) FROM ( SELECT DISTINCT the_column FROM the_table ) t;</code>
Dadurch werden zunächst nur die eindeutigen Werte in einer Unterabfrage ausgewählt und dann LISTAGG
auf dieses Ergebnis angewendet.
Einschließlich mehrerer Spalten:
Um zusätzliche Spalten einzuschließen und die Einzigartigkeit zu wahren, ist ein fortgeschrittenerer Ansatz erforderlich:
<code class="language-sql">SELECT col1, LISTAGG(col2, ',') WITHIN GROUP (ORDER BY col2) FROM ( SELECT col1, col2, ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY col1) AS rn FROM foo ORDER BY col1, col2 ) WHERE rn = 1 GROUP BY col1;</code>
Dabei wird ROW_NUMBER()
verwendet, um jeder Kombination aus col1
und col2
einen eindeutigen Rang zuzuweisen. Die äußere Abfrage wählt dann nur das erste Vorkommen (rn = 1) für jede eindeutige Kombination aus und stellt so sicher, dass Duplikate vor der Aggregation eliminiert werden.
Das obige ist der detaillierte Inhalt vonWie kann ich Duplikate entfernen, wenn ich die LISTAGG-Funktion von Oracle verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!