sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server 2008:slet dublerede rækker

Du kan DELETE fra 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() funktion tildeler et nummer til hver række. PARTITION BY bruges til at starte nummereringen forfra for hvert element i den gruppe, i dette tilfælde hver værdi af uniqueid vil begynde at nummerere ved 1 og gå op derfra. ORDER BY bestemmer hvilken rækkefølge tallene går i. Da hver uniqueid bliver nummereret fra 1, enhver post med en ROW_NUMBER() større end 1 har en dublet uniqueid

For at få en forståelse af, hvordan ROW_NUMBER() funktionen virker, bare prøv den:

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

Du kan justere logikken i ROW_NUMBER() funktion til at justere, hvilken registrering du vil beholde eller fjerne.

For eksempel vil du måske gerne gøre dette i flere trin, først at slette poster med det samme efternavn, men forskellige fornavne, du kan tilføje efternavn til 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. Metode til at finde huller i tidsseriedata i MySQL?

  2. MySQL pivot-lignende operation for at få en opdeling af procentdelen af ​​de samlede hændelser pr. dag pr. begivenhedstype

  3. Vælg SQL Server-databasestørrelse

  4. SQL-forespørgsel efter samlet antal point inden for radius af en placering