ホームページ >データベース >mysql チュートリアル >Oracle の LISTAGG 関数を使用するときに重複を削除するにはどうすればよいですか?
Oracle LISTAGG: 固有の結果の重複値の処理
Oracle の LISTAGG 関数は、データの集約には強力ですが、本質的に重複エントリを削除しません。 繰り返しを含むすべての値を単一の文字列に連結します。 個別の値の集計を実現する方法は次のとおりです:
Oracle 19c 以降の方法:
Oracle 19c 以降のバージョンでは、簡素化されたソリューションが提供されます。
<code class="language-sql">SELECT LISTAGG(DISTINCT the_column, ',') WITHIN GROUP (ORDER BY the_column) FROM the_table;</code>
これは、DISTINCT
関数自体内に LISTAGG
キーワードを直接組み込みます。
Oracle 18c 以前の方法:
古いバージョン (18c 以下) の場合は、サブクエリが必要です。
<code class="language-sql">SELECT LISTAGG(the_column, ',') WITHIN GROUP (ORDER BY the_column) FROM ( SELECT DISTINCT the_column FROM the_table ) t;</code>
これは、まずサブクエリ内の固有の値のみを選択し、次にその結果に LISTAGG
を適用します。
複数の列を含む:
追加の列を含めて一意性を維持するには、より高度なアプローチが必要です。
<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>
これは、ROW_NUMBER()
を使用して、col1
と col2
の各組み合わせに一意のランクを割り当てます。 次に、外側のクエリは、一意の組み合わせごとに最初に出現したもの (rn = 1) のみを選択し、集計前に重複が確実に削除されるようにします。
以上がOracle の LISTAGG 関数を使用するときに重複を削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。