2012-04-16 5 views
0

먼저 질문을 이해하기 쉽게 예제 테이블 테이블을 알려 드리겠습니다.중복 찾기 SQL

Column1  Column2  Column3 
Valuea  Value123  Value456 
Valueax  Value123  Value456 
Valueb  Value123  Value456 
Valueb  Value123  Value456 

select Column1, 
    Column2, 
     Column3, 
     count(*) 
from  ColumnName 
group by 
    Column1, 
    Column2, 
    Column3, 
having count(Count2+Count3) > 1 

나는 열 2and3이 달라야 개 중복보다 더 있지만 ', 컬럼을'포함 ', 컬럼 1', '2 열', '3 열'을 반환합니다.

Valueb  Value123  Value456 2 

을하지만 난 그것을, 컬럼은 서로 다른 값 만 2 열 및 3 열 값이

Valuea  Value123  Value456 
Valueax  Value123  Value456 

이 동일 반환 할 : 그래서 현재 위의 코드는 반환합니다.

답변

3

연결하여 그룹화 할 수 없습니다. 이것은 'xxx'+ 'yyy'를 'x'+ 'xxyyy'와 동일하게 취급합니다. 어때요?

;WITH x AS 
(
    SELECT Column2, Column3 
    FROM dbo.table GROUP BY Column2, Column3 
    HAVING COUNT(*) > 1 
) 
SELECT t.Column1, t.Column2, t.Column3 
FROM x INNER JOIN dbo.table AS t 
ON x.Column2 = t.Column2 
AND x.Column3 = t.Column3 
GROUP BY t.Column1, t.Column2, t.Column3 
HAVING COUNT(*) = 1; 

여기에는 이러한 열이 모두 NULL로 간주되지 않는다고 가정합니다. 내가 제대로 질문을 이해한다면

+0

참고가있는 경우 그와 동일 언급 한 바와 같이 그룹화 할 필요가있는 것을 고려할 필요가있다 세 행, 일부는 중복 (예 :'Valuea','Valueax' 및'Valueax') 후자의 두 가지는보고되지 않습니다 ... 잠재적 인 경우에는 더 많은 샘플 데이터를 제공해야하고 원하는 방법은 그 사건을 처리하라. –

0

, 당신은 당신의 테이블에 대한 고유 한 행 기록을 갖고 싶어

. Aaron이 언급 한 Group By을 사용하는 대신 연결하는 데 사용할 수 없습니다.

그러나 Over을 사용해도됩니다.

UPDATE : 당신은 당신이 아론이 "X"+ "YY"는 "XY"+ "Y"

With Data AS 
(
SELECT ROW_NUMBER() Over 
    (Partition By "Key" Order by "Key") as R, 
    Column1, Column2, Column3 
) 
SELECT * FROM Data 
WHERE R = 1 
+1

'Part1 By Column1 + Column2 + Column3'? 그것은 다소 위험합니다. ''x '+'yy '+'z ''는''xy '+'y '+'z ''와 똑같이 취급 될 것입니다. 어쨌든 당신이 그것을 무시하더라도 나는 이것이 원하는 결과를 줄 것이라고 생각하지 않습니다 - 왜'R = 1'입니까? –

+0

나는 너의 포스트를 읽은 후에 그것을 알아 차리지 못했다. 나는 대답을 편집 할 것이다. – Turbot

+0

이것이 원하는 결과를 도출 할 수있는 방법을 아직 알지 못합니다. –