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!