una tabla registros filtrar evitar encontrar eliminar duplicados datos consulta buscar sql sql-server duplicates

tabla - sql duplicados having



Encontrar filas duplicadas en SQL Server (16)

Creo que sé lo que necesitas. Necesitaba mezclar las respuestas y creo que obtuve la solución que quería:

select o.id,o.orgName, oc.dupeCount, oc.id,oc.orgName from organizations o inner join ( SELECT MAX(id) as id, orgName, COUNT(*) AS dupeCount FROM organizations GROUP BY orgName HAVING COUNT(*) > 1 ) oc on o.orgName = oc.orgName

tener el ID máximo le dará el ID del dublicado y el del original, que es lo que pidió:

id org name , dublicate count (missing out in this case) id doublicate org name , doub count (missing out again because does not help in this case)

Lo único triste es que lo pongas en esta forma

id , name , dubid , name

espero que todavía ayude

Tengo una base de datos de SQL Server de organizaciones, y hay muchas filas duplicadas. Quiero ejecutar una declaración de selección para obtener todos estos y la cantidad de duplicados, pero también devolver los identificadores asociados con cada organización.

Una declaración como:

SELECT orgName, COUNT(*) AS dupes FROM organizations GROUP BY orgName HAVING (COUNT(*) > 1)

Volverá algo como

orgName | dupes ABC Corp | 7 Foo Federation | 5 Widget Company | 2

Pero también me gustaría agarrar las identificaciones de ellos. ¿Hay alguna manera de hacer esto? Tal vez como un

orgName | dupeCount | id ABC Corp | 1 | 34 ABC Corp | 2 | 5 ... Widget Company | 1 | 10 Widget Company | 2 | 2

La razón es que también hay una tabla separada de usuarios que se vinculan a estas organizaciones, y me gustaría unificarlas (por lo tanto, eliminar los duplicados para que los usuarios se vinculen a la misma organización en lugar de las organizaciones duplicadas). Pero me gustaría una parte manualmente para no arruinar nada, pero todavía necesito una declaración que devuelva los ID de todas las organizaciones de duplicidad para poder revisar la lista de usuarios.


La solución marcada como correcta no funcionó para mí, pero encontré esta respuesta que funcionó simplemente bien: obtener una lista de filas duplicadas en MySql

SELECT n1.* FROM myTable n1 INNER JOIN myTable n2 ON n2.repeatedCol = n1.repeatedCol WHERE n1.id <> n2.id


Puede ejecutar la siguiente consulta y encontrar los duplicados con max(id) y eliminar esas filas.

SELECT orgName, COUNT(*), Max(ID) AS dupes FROM organizations GROUP BY orgName HAVING (COUNT(*) > 1)

Pero tendrás que ejecutar esta consulta unas cuantas veces.


Puedes hacerlo así:

SELECT o.id, o.orgName, d.intCount FROM ( SELECT orgName, COUNT(*) as intCount FROM organizations GROUP BY orgName HAVING COUNT(*) > 1 ) AS d INNER JOIN organizations o ON o.orgName = d.orgName

Si desea devolver solo los registros que se pueden eliminar (dejando uno de cada uno), puede utilizar:

SELECT id, orgName FROM ( SELECT orgName, id, ROW_NUMBER() OVER (PARTITION BY orgName ORDER BY id) AS intRow FROM organizations ) AS d WHERE intRow != 1

Edición: SQL Server 2000 no tiene la función ROW_NUMBER (). En su lugar, puede utilizar:

SELECT o.id, o.orgName, d.intCount FROM ( SELECT orgName, COUNT(*) as intCount, MIN(id) AS minId FROM organizations GROUP BY orgName HAVING COUNT(*) > 1 ) AS d INNER JOIN organizations o ON o.orgName = d.orgName WHERE d.minId != o.id


Puedes probar esto, es lo mejor para ti.

WITH CTE AS ( SELECT *,RN=ROW_NUMBER() OVER (PARTITION BY orgName ORDER BY orgName DESC) FROM organizations ) select * from CTE where RN>1 go


Si desea eliminar duplicados:

WITH CTE AS( SELECT orgName,id, RN = ROW_NUMBER()OVER(PARTITION BY orgName ORDER BY Id) FROM organizations ) DELETE FROM CTE WHERE RN > 1


Supongamos que tenemos la tabla "Estudiante" con 2 columnas:

  • student_id int
  • student_name varchar

    Records: +------------+---------------------+ | student_id | student_name | +------------+---------------------+ | 101 | usman | | 101 | usman | | 101 | usman | | 102 | usmanyaqoob | | 103 | muhammadusmanyaqoob | | 103 | muhammadusmanyaqoob | +------------+---------------------+

Ahora queremos ver registros duplicados Use esta consulta:

select student_name,student_id ,count(*) c from student group by student_id,student_name having c>1;

+---------------------+------------+---+ | student_name | student_id | c | +---------------------+------------+---+ | usman | 101 | 3 | | muhammadusmanyaqoob | 103 | 2 | +---------------------+------------+---+


Tengo una mejor opción para obtener los registros duplicados en una tabla

SELECT x.studid, y.stdname, y.dupecount FROM student AS x INNER JOIN (SELECT a.stdname, COUNT(*) AS dupecount FROM student AS a INNER JOIN studmisc AS b ON a.studid = b.studid WHERE (a.studid LIKE ''2018%'') AND (b.studstatus = 4) GROUP BY a.stdname HAVING (COUNT(*) > 1)) AS y ON x.stdname = y.stdname INNER JOIN studmisc AS z ON x.studid = z.studid WHERE (x.studid LIKE ''2018%'') AND (z.studstatus = 4) ORDER BY x.stdname

El resultado de la consulta anterior muestra todos los nombres duplicados con ID de estudiantes únicos y el número de ocurrencias duplicadas

Haga clic aquí para ver el resultado del sql.


Tienes varias formas para seleccionar duplicate rows .

para mis soluciones, primero considere esta tabla por ejemplo

CREATE TABLE #Employee ( ID INT, FIRST_NAME NVARCHAR(100), LAST_NAME NVARCHAR(300) ) INSERT INTO #Employee VALUES ( 1, ''Ardalan'', ''Shahgholi'' ); INSERT INTO #Employee VALUES ( 2, ''name1'', ''lname1'' ); INSERT INTO #Employee VALUES ( 3, ''name2'', ''lname2'' ); INSERT INTO #Employee VALUES ( 2, ''name1'', ''lname1'' ); INSERT INTO #Employee VALUES ( 3, ''name2'', ''lname2'' ); INSERT INTO #Employee VALUES ( 4, ''name3'', ''lname3'' );

Primera solución:

SELECT DISTINCT * FROM #Employee; WITH #DeleteEmployee AS ( SELECT ROW_NUMBER() OVER(PARTITION BY ID, First_Name, Last_Name ORDER BY ID) AS RNUM FROM #Employee ) SELECT * FROM #DeleteEmployee WHERE RNUM > 1 SELECT DISTINCT * FROM #Employee

Solución Secundaria: Usar campo de identity

SELECT DISTINCT * FROM #Employee; ALTER TABLE #Employee ADD UNIQ_ID INT IDENTITY(1, 1) SELECT * FROM #Employee WHERE UNIQ_ID < ( SELECT MAX(UNIQ_ID) FROM #Employee a2 WHERE #Employee.ID = a2.ID AND #Employee.FIRST_NAME = a2.FIRST_NAME AND #Employee.LAST_NAME = a2.LAST_NAME ) ALTER TABLE #Employee DROP COLUMN UNIQ_ID SELECT DISTINCT * FROM #Employee

y al final de toda solución usa este comando

DROP TABLE #Employee


Tratar

SELECT orgName, id, count(*) as dupes FROM organizations GROUP BY orgName, id HAVING count(*) > 1;


Select * from (Select orgName,id, ROW_NUMBER() OVER(Partition By OrgName ORDER by id DESC) Rownum From organizations )tbl Where Rownum>1

Así que los registros con rowum> 1 serán los registros duplicados en su tabla. ''Partición por'' primer grupo por los registros y luego serializarlos dándoles los números de serie. Entonces rownum> 1 serán los registros duplicados que podrían borrarse como tales.


select * from [Employees]

Para encontrar el registro duplicado 1) Usando CTE

with mycte as ( select Name,EmailId,ROW_NUMBER() over(partition by Name,EmailId order by id) as Duplicate from [Employees] ) select * from mycte

2) Usando GroupBy

select Name,EmailId,COUNT(name) as Duplicate from [Employees] group by Name,EmailId


select a.orgName,b.duplicate, a.id from organizations a inner join ( SELECT orgName, COUNT(*) AS duplicate FROM organizations GROUP BY orgName HAVING COUNT(*) > 1 ) b on o.orgName = oc.orgName group by a.orgName,a.id


select column_name, count(column_name) from table_name group by column_name having count (column_name) > 1;

Src: https://.com/a/59242/1465252


select o.orgName, oc.dupeCount, o.id from organizations o inner join ( SELECT orgName, COUNT(*) AS dupeCount FROM organizations GROUP BY orgName HAVING COUNT(*) > 1 ) oc on o.orgName = oc.orgName


select orgname, count(*) as dupes, id from organizations where orgname in ( select orgname from organizations group by orgname having (count(*) > 1) ) group by orgname, id