with cte as (
select row_number() over (partition by dupcol1, dupcol2 order by ID) as rn
from table)
delete from cte
where rn > 2; -- or >3 etc
Kueri membuat 'nomor baris' untuk setiap catatan, dikelompokkan berdasarkan (dupcol1, dupcol2) dan diurutkan berdasarkan ID. Akibatnya nomor baris ini menghitung 'duplikat' yang memiliki dupcol1 dan dupcol2 yang sama dan kemudian menetapkan nomor 1, 2, 3.. N, diurutkan berdasarkan ID. Jika Anda ingin menyimpan hanya 2 'duplikat', maka Anda perlu menghapus yang diberi nomor 3,4,.. N
dan itu adalah bagian yang diurus oleh DELLETE.. WHERE rn > 2;
Dengan menggunakan metode ini, Anda dapat mengubah ORDER BY
agar sesuai dengan pesanan pilihan Anda (mis.ORDER BY ID DESC
), sehingga LATEST
memiliki rn=1
, maka selanjutnya yang terbaru adalah rn=2 dan seterusnya. Selebihnya tetap sama, DELETE
akan menghapus hanya yang tertua karena mereka memiliki nomor baris tertinggi.
Tidak seperti pertanyaan yang berkaitan erat ini , saat kondisinya menjadi lebih kompleks, penggunaan CTE dan row_number() menjadi lebih sederhana. Performa mungkin masih bermasalah jika tidak ada indeks akses yang tepat.