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