traer repetir repetidos registros mostrar eliminar duplicados consulta buscar agrupar sql sql-server tsql

repetir - T-SQL: borrando todas las filas duplicadas pero manteniendo una



no repetir registros en consulta sql (3)

Aquí está mi giro, con un ejemplo ejecutable. Tenga en cuenta que esto solo funcionará en la situación en la que la Id sea ​​única y que tenga valores duplicados en otras columnas.

DECLARE @SampleData AS TABLE (Id int, Duplicate varchar(20)) INSERT INTO @SampleData SELECT 1, ''ABC'' UNION ALL SELECT 2, ''ABC'' UNION ALL SELECT 3, ''LMN'' UNION ALL SELECT 4, ''XYZ'' UNION ALL SELECT 5, ''XYZ'' DELETE FROM @SampleData WHERE Id IN ( SELECT Id FROM ( SELECT Id ,ROW_NUMBER() OVER (PARTITION BY [Duplicate] ORDER BY Id) AS [ItemNumber] -- Change the partition columns to include the ones that make the row distinct FROM @SampleData ) a WHERE ItemNumber > 1 -- Keep only the first unique item ) SELECT * FROM @SampleData

Y los resultados:

Id Duplicate ----------- --------- 1 ABC 3 LMN 4 XYZ

No estoy seguro de por qué pensé eso primero ... definitivamente no es la forma más sencilla de hacerlo, pero funciona.

Posible duplicado:
SQL - ¿Cómo puedo eliminar filas duplicadas?

Tengo una tabla con una gran cantidad de filas. No se permiten duplicados, pero debido a un problema con la forma en que se crearon las filas, sé que hay algunos duplicados en esta tabla. Necesito eliminar las filas adicionales desde la perspectiva de las columnas clave. Algunas otras columnas pueden tener datos ligeramente diferentes, pero eso no me importa. Todavía tengo que mantener una de estas filas sin embargo. SELECT DISTINCT no funcionará porque funciona en todas las columnas y debo suprimir los duplicados según las columnas clave.

¿Cómo puedo eliminar las filas adicionales pero aún mantener una de manera eficiente?


Consulta de ejemplo:

DELETE FROM Table WHERE ID NOT IN ( SELECT MIN(ID) FROM Table GROUP BY Field1, Field2, Field3, ... )

Aquí los fields son la columna en la que desea agrupar las filas duplicadas.


No dijo qué versión estaba usando, pero en SQL 2005 y versiones posteriores, puede usar una expresión de tabla común con la cláusula OVER . Va un poco algo como esto:

WITH cte AS ( SELECT[foo], [bar], row_number() OVER(PARTITION BY foo, bar ORDER BY baz) AS [rn] FROM TABLE ) DELETE cte WHERE [rn] > 1

Juega un poco con él y mira lo que obtienes.

(Editar: en un intento de ser útil, alguien editó la cláusula ORDER BY dentro del CTE. Para ser claros, puede ordenar por lo que quiera aquí, no es necesario que sea una de las columnas que devuelve el cte. De hecho, Un caso de uso común aquí es que "foo, bar" son el identificador de grupo y "baz" es una especie de marca de tiempo. Para mantener lo último, deberías hacer ORDER BY baz desc )