sql >> Base de Datos >  >> RDS >> Sqlserver

Eliminar filas duplicadas en SQL Server

El siguiente ejemplo usa T-SQL para eliminar filas duplicadas en SQL Server.

Para ser más específicos, elimina filas duplicadas pero mantiene una. Entonces, si tiene dos filas idénticas, elimina una de ellas y mantiene la otra. En otras palabras, elimina los duplicados de la tabla.

Datos de muestra

Supongamos que tenemos una tabla con los siguientes datos:

SELECT * FROM Pets;

Resultado:

+---------+-----------+-----------+
| PetId   | PetName   | PetType   |
|---------+-----------+-----------|
| 1       | Wag       | Dog       |
| 1       | Wag       | Dog       |
| 2       | Scratch   | Cat       |
| 3       | Tweet     | Bird      |
| 4       | Bark      | Dog       |
| 4       | Bark      | Dog       |
| 4       | Bark      | Dog       |
+---------+-----------+-----------+

Podemos ver que las dos primeras filas están duplicadas, al igual que las últimas tres filas.

Seleccionar duplicados

Antes de desduplicar la tabla, podemos usar la siguiente consulta para ver qué fila/s se eliminarán:

WITH CTE AS 
    (
        SELECT 
            *, 
            ROW_NUMBER() OVER ( 
                PARTITION BY PetId, PetName, PetType 
                ORDER BY PetId, PetName, PetType
                ) AS Row_Number
        FROM Pets
    )
SELECT * FROM CTE WHERE Row_Number <> 1;

Resultado:

+---------+-----------+-----------+--------------+
| PetId   | PetName   | PetType   | Row_Number   |
|---------+-----------+-----------+--------------|
| 1       | Wag       | Dog       | 2            |
| 4       | Bark      | Dog       | 2            |
| 4       | Bark      | Dog       | 3            |
+---------+-----------+-----------+--------------+

Eliminar duplicados

Para eliminar valores duplicados, podemos modificar la consulta anterior reemplazando SELECT * en la última línea con DELETE :

WITH CTE AS 
    (
        SELECT 
            *, 
            ROW_NUMBER() OVER ( 
                PARTITION BY PetId, PetName, PetType 
                ORDER BY PetId, PetName, PetType
                ) AS Row_Number
        FROM Pets
    )
DELETE FROM CTE WHERE Row_Number <> 1;

Resultado:

(3 rows affected)

La tabla ahora ha sido deduplicada.

Podemos verificar esto seleccionando todas las filas nuevamente:

SELECT * FROM Pets;

Resultado:

+---------+-----------+-----------+
| PetId   | PetName   | PetType   |
|---------+-----------+-----------|
| 1       | Wag       | Dog       |
| 2       | Scratch   | Cat       |
| 3       | Tweet     | Bird      |
| 4       | Bark      | Dog       |
+---------+-----------+-----------+

Como era de esperar, una de las filas duplicadas de nuestro perro "Wag" se eliminó y la otra permanece. También se han eliminado dos de las filas duplicadas para "Ladrar". La tabla se ha eliminado correctamente.