이있다.
효과적으로 나는 COUNT() 윈도우 기능을 사용하는 것이 좋습니다 수있는 중복 값을 가진 모든 레코드를 선택 위해서는 :
drop table #tmp
CREATE table #tmp (ID int , EmpFirstName varchar(10) , EmpLastName varchar(10))
go
INSERT INTO #tmp VALUES
(1,'X','Y')
,(2,'A','B')
,(3,'A','B')
,(4,'A','C')
,(5,'B','C')
,(6,'B','C')
;with a as (
select ID, EmpFirstName, EmpLastName,
ROW_NUMBER() OVER (PARTITION BY EmpFirstName, EmpLastName ORDER BY ID) AS RowNum,
COUNT(id) OVER (PARTITION BY EmpFirstName, EmpLastName) AS cnt
FROM #tmp
)
SELECT * FROM a where cnt > 1
ORDER BY EmpFirstName, EmpLastName
결과 :
가이 쿼리를 사용
;with a as (
select ID, EmpFirstName, EmpLastName,
ROW_NUMBER() OVER (PARTITION BY EmpFirstName, EmpLastName ORDER BY ID) AS RowNum,
COUNT(*) OVER (PARTITION BY EmpFirstName, EmpLastName) AS cnt
FROM aTable
)
SELECT * FROM a where cnt > 1
ORDER BY EmpFirstName, EmpLastName
테스트
ID EmpFirstName EmpLastName RowNum cnt
----------- ------------ ----------- -------------------- -----------
2 A B 1 2
3 A B 2 2
5 B C 1 2
6 B C 2 2
출처
2016-08-11 05:30:28
cha
두 번째 레코드가'RowNum' ='을 1'이있는 경우는, 왜 당신은 당신의 결과에 설정하는 것이할까요? 이것은 나에게 모순되는 것처럼 들린다. –
사실 @TimBiegeleisen 세트에 중복 레코드가 있으면 전체 레코드 정보가 필요합니다. 원래의 데이터 세트에는 많은 필드가 있으며 분명히 중복은 삭제되지만 결정을 내리기 위해서는 두 레코드 모두 출력이 필요합니다. 'RowNum = 2'을 선택하면 2 차 레코드 또는 1 차 레코드를 삭제할지 여부를 결정할 수 없습니다. –
첫 번째와 두 번째 행이 중복 된 것을 볼 수 있지만 'RowNum'값은 여전히 1 미만입니다. –