[sql] SQL Server에서 중복 행 찾기

조직의 SQL Server 데이터베이스가 있으며 중복 행이 많이 있습니다. select 문을 실행하여이 모든 내용과 중복 된 내용을 파악하고 각 조직과 관련된 ID도 반환하려고합니다.

다음과 같은 진술 :

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

같은 것을 반환합니다

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

그러나 나는 또한 그것들의 ID를 얻고 싶습니다. 이것을 할 수있는 방법이 있습니까? 아마

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

그 이유는 이러한 조직에 연결되는 별도의 사용자 테이블이 있기 때문에 통합하고 싶습니다 (따라서 듀프를 제거하여 사용자가 듀프 조직 대신 동일한 조직에 연결). 그러나 수동으로 부분을 원하므로 아무것도 조이지 않아도 모든 듀프 조직의 ID를 반환하는 진술이 필요하므로 사용자 목록을 살펴볼 수 있습니다.



답변

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


답변

다음 쿼리를 실행하고 max(id)해당 행을 사용 하여 중복 항목을 찾아 삭제할 수 있습니다.

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

그러나이 쿼리를 몇 번 실행해야합니다.


답변

다음과 같이 할 수 있습니다.

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

삭제할 수있는 레코드 만 반환하려면 (둘 중 하나를 남겨두고) 다음을 사용할 수 있습니다.

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

편집 : SQL Server 2000에는 ROW_NUMBER () 함수가 없습니다. 대신 다음을 사용할 수 있습니다.

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


답변

올바른 것으로 표시된 솔루션은 저에게 효과가 없었지만이 답변은 훌륭하게 작동했습니다 .MySql에서 중복 행 목록 가져 오기

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


답변

당신은 이것을 시도 할 수 있습니다, 그것은 당신에게 가장 좋습니다

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


답변

중복을 삭제하려는 경우 :

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


답변

select * from [Employees]

중복 레코드 찾기 1) 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) GroupBy를 사용함으로써

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