ホームページ >データベース >mysql チュートリアル >Oracle の LISTAGG 関数を使用するときに重複を削除するにはどうすればよいですか?

Oracle の LISTAGG 関数を使用するときに重複を削除するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-19 18:12:11595ブラウズ

How Can I Remove Duplicates When Using Oracle's LISTAGG Function?

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() を使用して、col1col2 の各組み合わせに一意のランクを割り当てます。 次に、外側のクエリは、一意の組み合わせごとに最初に出現したもの (rn = 1) のみを選択し、集計前に重複が確実に削除されるようにします。

以上がOracle の LISTAGG 関数を使用するときに重複を削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。