validar seleccionar repetidos registros para omitir iguales eliminar duplicados consulta campos sql sql-server tsql sql-server-2008

seleccionar - sql omitir repetidos



Seleccione declaraciĆ³n para encontrar duplicados en ciertos campos (6)

Esta es una solución divertida con SQL Server 2005 que me gusta. Voy a asumir que por "para cada registro, excepto por el primero", quiere decir que hay otra columna "id" que podemos usar para identificar qué fila es "primero".

SELECT id , field1 , field2 , field3 FROM ( SELECT id , field1 , field2 , field3 , RANK() OVER (PARTITION BY field1, field2, field3 ORDER BY id ASC) AS [rank] FROM table_name ) a WHERE [rank] > 1

¿Puede ayudarme con sentencias de SQL para encontrar duplicados en varios campos?

Por ejemplo, en pseudo código:

select count(field1,field2,field3) from table where the combination of field1, field2, field3 occurs multiple times

y de la declaración anterior, si hay varias apariciones, me gustaría seleccionar todos los registros excepto el primero .


Para obtener la lista de campos para los que hay varios registros, puede utilizar ...

select field1,field2,field3, count(*) from table_name group by field1,field2,field3 having count(*) > 1

Compruebe este enlace para obtener más información sobre cómo eliminar las filas.

http://support.microsoft.com/kb/139444

Editar: Como mencionaron los otros usuarios, debería haber un criterio para decidir cómo definir "primeras filas" antes de usar el enfoque en el enlace anterior. En función de eso, deberá utilizar una cláusula orden por orden y una sub consulta si es necesario. Si puede publicar algunos datos de muestra, sería de gran ayuda.


Si está utilizando SQL Server 2005 o posterior (y las etiquetas para su pregunta indican SQL Server 2008), puede usar las funciones de clasificación para devolver los registros duplicados después del primero, si usar uniones es menos deseable o poco práctico por algún motivo. El siguiente ejemplo muestra esto en acción, donde también funciona con valores nulos en las columnas examinadas.

create table Table1 ( Field1 int, Field2 int, Field3 int, Field4 int ) insert Table1 values (1,1,1,1) , (1,1,1,2) , (1,1,1,3) , (2,2,2,1) , (3,3,3,1) , (3,3,3,2) , (null, null, 2, 1) , (null, null, 2, 3) select * from (select Field1 , Field2 , Field3 , Field4 , row_number() over (partition by Field1 , Field2 , Field3 order by Field4) as occurrence from Table1) x where occurrence > 1

Observe después de ejecutar este ejemplo que el primer registro de cada "grupo" se excluye, y que los registros con valores nulos se manejan correctamente.

Si no tiene una columna disponible para ordenar los registros dentro de un grupo, puede usar las columnas de partición por como las columnas de ordenar por.


Usted menciona "el primero", así que asumo que tiene algún tipo de orden en sus datos. Supongamos que sus datos están ordenados por algún ID campo.

Este SQL debería obtener las entradas duplicadas excepto la primera. Básicamente, selecciona todas las filas para las que existe otra fila con (a) los mismos campos y (b) una ID inferior. El rendimiento no será bueno, pero podría resolver su problema.

SELECT A.ID, A.field1, A.field2, A.field3 FROM myTable A WHERE EXISTS (SELECT B.ID FROM myTable B WHERE B.field1 = A.field1 AND B.field2 = A.field2 AND B.field3 = A.field3 AND B.ID < A.ID)


Ver valor duplicado.

with MYCTE as ( select row_number() over ( partition by name order by name) rown, * from tmptest ) select * from MYCTE where rown <=1


CREATE TABLE #tmp ( sizeId Varchar(MAX) ) INSERT #tmp VALUES (''44''), (''44,45,46''), (''44,45,46''), (''44,45,46''), (''44,45,46''), (''44,45,46''), (''44,45,46'') SELECT * FROM #tmp DECLARE @SqlStr VARCHAR(MAX) SELECT @SqlStr = STUFF((SELECT '','' + sizeId FROM #tmp ORDER BY sizeId FOR XML PATH('''')), 1, 1, '''') SELECT TOP 1 * FROM ( select items, count(*)AS Occurrence FROM dbo.Split(@SqlStr,'','') group by items having count(*) > 1 )K ORDER BY K.Occurrence DESC