Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mengalih Keluar Pendua Apabila Menggunakan Fungsi LISTAGG Oracle?

Bagaimanakah Saya Boleh Mengalih Keluar Pendua Apabila Menggunakan Fungsi LISTAGG Oracle?

Barbara Streisand
Barbara Streisandasal
2025-01-19 18:12:11595semak imbas

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

Oracle LISTAGG: Mengendalikan Nilai Pendua untuk Hasil Unik

Fungsi LISTAGG Oracle, walaupun berkuasa untuk mengagregat data, tidak semestinya mengalih keluar masukan pendua. Ia menggabungkan semua nilai, termasuk pengulangan, ke dalam satu rentetan. Begini cara untuk mencapai pengagregatan nilai yang berbeza:

Kaedah untuk Oracle 19c dan Kemudian:

Oracle 19c dan versi yang lebih baru menawarkan penyelesaian yang dipermudahkan:

<code class="language-sql">SELECT LISTAGG(DISTINCT the_column, ',') WITHIN GROUP (ORDER BY the_column)
FROM the_table;</code>

Ini secara langsung menggabungkan kata kunci DISTINCT dalam fungsi LISTAGG itu sendiri.

Kaedah untuk Oracle 18c dan Terdahulu:

Untuk versi lama (18c dan ke bawah), subquery diperlukan:

<code class="language-sql">SELECT LISTAGG(the_column, ',') WITHIN GROUP (ORDER BY the_column)
FROM (
  SELECT DISTINCT the_column
  FROM the_table
) t;</code>

Pertama kali ini hanya memilih nilai unik dalam subkueri, kemudian digunakan LISTAGG pada hasil carian tersebut.

Termasuk Berbilang Lajur:

Untuk memasukkan lajur tambahan dan mengekalkan keunikan, pendekatan yang lebih maju diperlukan:

<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>

Ini menggunakan ROW_NUMBER() untuk menetapkan kedudukan unik kepada setiap gabungan col1 dan col2. Pertanyaan luar kemudian hanya memilih kejadian pertama (rn = 1) untuk setiap gabungan unik, memastikan pendua dihapuskan sebelum pengagregatan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengalih Keluar Pendua Apabila Menggunakan Fungsi LISTAGG Oracle?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn