Select statement para encontrar duplicados en ciertos campos


¿Puede ayudarme con instrucciones SQL para encontrar duplicados en múltiples 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 múltiples ocurrencias Me gustaría seleccionar cada registro excepto el primero.

Author: joragupra, 2010-12-14

6 answers

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

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

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

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

Editar : Como los otros usuarios mencionaron, debe haber un criterio para decidir cómo definir "primeras filas" antes de usar el enfoque en el enlace anterior. Basado en eso, necesitará usar una cláusula order by y una sub consulta si es necesario. Si puede publicar alguna muestra data, realmente ayudaría.

 811
Author: Rajesh Chamarthi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-13 22:56:50

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

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) un ID inferior. El rendimiento no será genial, pero podría resolver tu 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)
 42
Author: Heinzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-13 22:39:54

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

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
 17
Author: Nick Vaccaro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-13 23:03:49

Para ver el valor duplicado

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

                ) 
              select * from MYCTE where rown <=1
 5
Author: manoj Verma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-29 11:58:47

Si está utilizando SQL Server 2005 o posterior (y las etiquetas de su pregunta indican SQL Server 2008), puede usar funciones de clasificación para devolver los registros duplicados después del primero si el uso de uniones es menos deseable o poco práctico por alguna razón. 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" está excluido, y que los registros con null los valores se manejan correctamente.

Si no tiene una columna disponible para ordenar los registros dentro de un grupo, puede usar las columnas partition-by como columnas order-by.

 3
Author: Bradford Hoagland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-13 22:59:22
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    
 1
Author: Mr.X,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-19 11:50:32