Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL Query - Hapus duplikat jika lebih dari 3 dups?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Permintaan yang sama - rencana eksekusi yang berbeda

  2. Tetapkan Profil Publik Default untuk Database Mail (SSMS)

  3. SQL vs Parameter yang dibuat secara dinamis di SQL Server

  4. SQL - Bagaimana cara menyimpan dan menavigasi hierarki?

  5. Peningkatan Platform Data SQL Server pada tahun 2015