sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server 2008:ta bort dubbletter av rader

Du kan DELETE från en cte:

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

ROW_NUMBER() funktionen tilldelar ett nummer till varje rad. PARTITION BY används för att starta om numreringen för varje objekt i den gruppen, i det här fallet varje värde på uniqueid kommer att börja numrera vid 1 och gå upp därifrån. ORDER BY bestämmer vilken ordning numren går i. Eftersom varje uniqueid numreras från 1, vilken post som helst med en ROW_NUMBER() större än 1 har en dubblett av uniqueid

För att få en förståelse för hur ROW_NUMBER() funktionen fungerar, prova bara:

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

Du kan justera logiken för ROW_NUMBER() funktion för att justera vilken post du ska behålla eller ta bort.

Till exempel kanske du vill göra detta i flera steg, först radera poster med samma efternamn men olika förnamn, du kan lägga till efternamn till 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. SQLite-uppdatering

  2. Använder PHP DOM för att skapa XML-filer från MySQL-data

  3. SQL Server ALL Operatör förklaras

  4. räkna antalet kolumner som har data för varje rad