Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server 2008:usuń zduplikowane wiersze

Możesz DELETE z akt:

WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
             FROM Table)
DELETE FROM cte 
WHERE RowRank > 1

ROW_NUMBER() funkcja przypisuje numer do każdego wiersza. PARTITION BY służy do rozpoczęcia numerowania od nowa dla każdego elementu w tej grupie, w tym przypadku każda wartość uniqueid zacznie numerować od 1 i stamtąd pójdzie w górę. ORDER BY określa, w jakiej kolejności wchodzą liczby. Ponieważ każdy uniqueid jest numerowany od 1, dowolny rekord z ROW_NUMBER() większe niż 1 ma zduplikowany uniqueid

Aby zrozumieć, jak ROW_NUMBER() funkcja działa, po prostu wypróbuj:

SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
FROM Table
ORDER BY uniqueid

Możesz dostosować logikę ROW_NUMBER() funkcja, aby dostosować rekord, który chcesz zachować lub usunąć.

Na przykład, być może chcesz to zrobić w wielu krokach, najpierw usuwając rekordy z tym samym nazwiskiem, ale różnymi imionami, możesz dodać nazwisko do PARTITION BY :

WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid, col3 ORDER BY col2)'RowRank'
             FROM Table)
DELETE FROM cte 
WHERE RowRank > 1


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyciek pamięci w aplikacji .net

  2. Jak wygenerować skrypt, aby włączyć wszystkie ograniczenia kluczy obcych w bazie danych programu SQL Server — samouczek programu SQL Server/TSQL, część 78

  3. Problem z liczeniem elementów w T-SQL

  4. Jak naprawić błąd „nazwa profilu jest nieprawidłowa” podczas aktualizowania profilu poczty bazy danych w programie SQL Server (T-SQL)

  5. SQL wybierz gdzie nie w podzapytaniu nie zwraca żadnych wyników