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.
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.
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)
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
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
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.
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
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