2010-08-12 3 views
1

내가 이렇게 내 DB에 중복 행을 찾기 위해 노력하고 있어요 :중복 행을 찾지 만 마지막 결과는 건너 뛰시겠습니까?

SELECT email, COUNT(emailid) AS NumOccurrences 
FROM users 
GROUP BY emailid HAVING (COUNT(emailid) > 1) 

이것은 EMAILID 발견 일치의 수를 반환합니다. 이제 내가 원하는 것은 ID 열과 내가 가진 다른 테이블을 비교하고 거기에 열을 개수와 함께 설정하는 것입니다.

다른 테이블에는 복제본이라는 중복 열이 있어야합니다. 예를 들어 emailid가 인 행이 3 개 있다고 가정 해 보겠습니다. 중복 된 열에는 3 개의 행 모두에 "3"이 있습니다. 내가 원하는 것은 처음 2 개에는 "2"이고 3 개는 일치하는 ID 행 중 마지막에 아무것도 표시되지 않습니다.

이것이 가능합니까?

업데이트 : 지금은 임시 테이블을 가지고 관리

, 다음과 같습니다

이제
mailid | rowcount | AmountOfDups 
643921 | 1 | 3 
643921 | 2 | 3 
643921 | 3 | 3 

, 나는 mailid으로 (첫 번째 2 업데이트 할 것을 결정할 수있는 방법) 다른 테이블에? 다른 테이블에는 mailid도 있습니다.

+0

같은 것을 시도해 볼 수도 있습니다 2005 +는 SQL 서버를 사용하십니까? ID의 모든 항목을 다시 매핑 한 다음 삭제 하시겠습니까? –

+0

보고서 (MS Reporting Services)에서 중복 된 항목을 강조 표시해야합니다. 표시된 행 중 2 개가 중복되어 있다고 말해야합니다 ... – grady

답변

0
SELECT ... 
     ROW_NUMBER() OVER (PARTITION BY email ORDER BY emailid DESC) AS RN 
FROM ... 

...은 이러한 문제에 대한 좋은 출발점입니다. ROW_NUMBER()의 힘을 과소 평가하지 마세요.

+0

이것이 제 경우에 도움이되는 방법을 보았습니다. 좀 더 자세히 알려주시겠습니까 ?-)? – grady

0

당신이 (전체 예제) 당신의 궁극적 인 목표는 중복을 확인하는 데 무슨

DECLARE @Table TABLE(
     ID INT IDENTITY(1,1), 
     Email VARCHAR(20) 
) 

INSERT INTO @Table (Email) SELECT 'a' 
INSERT INTO @Table (Email) SELECT 'b' 
INSERT INTO @Table (Email) SELECT 'c' 
INSERT INTO @Table (Email) SELECT 'a' 
INSERT INTO @Table (Email) SELECT 'b' 
INSERT INTO @Table (Email) SELECT 'a' 

; WITH Duplicates AS (
     SELECT Email, 
       COUNT(ID) TotalDuplicates 
     FROM @Table 
     GROUP BY Email 
     HAVING COUNT(ID) > 1 
) 
, Counts AS (
     SELECT t.ID, 
       ROW_NUMBER() OVER(PARTITION BY t.Email ORDER BY t.ID) EmailID, 
       d.TotalDuplicates 
     FROM @Table t INNER JOIN 
       Duplicates d ON t.Email = d.Email 
) 
SELECT ID, 
     CASE 
      WHEN EmailID = TotalDuplicates 
       THEN 0 
      ELSE TotalDuplicates - 1 
     END Dups 
FROM Counts 
관련 문제