MSSQL 중복 레코드 검색 방법 GROUP BY 예제

중복 하는 레코드를 제거할때 많이 사용 하는 것이 DISTINCT입니다.

DISTINCT는 중복 하는 레코드를 제거하고 표시 하기 때문에 중복인지 아닌지 바로 판단하기가 어렵습니다.

GROUP BY를 사용하면 중복 하는 레코드를 제거 할 수도 있지만 어떤 레코드 값이 중복하는 확인도 할 수 있습니다.

여러가지 상황을 예제로 보도록 하겠습니다.

 

중복데이터 취득

GROUP BYHAVING을 같이 사용해 중복하는 데이터만 추출 할 수 있습니다.

샘플을 보도록 하겠습니다.

컬럼A가 중복되는 데이터 취득

SELECT
	컬럼A
FROM
	테이블 이름
GROUP BY
	컬럼A
HAVING
	COUNT(컬럼A) > 1

 

위 샘플에서는 GROUP BY에 컬럼A를 지정해서 그룹 묶었습니다.

HAVING에서 COUNT함수를 사용해 그룹으로 묶은 컬럼A 갯수가 1보다 크면 출력하도록 하고 있습니다.

GROUP BY에서 중복 하는 레코드가 없는 값이라면 COUNT(컬럼A)의 결과는 1이 됩니다.

만약 중복하는 값이 있다면 COUNT(컬럼A)는 중복하는 갯수만큼의 숫자를 반환합니다.

즉, 1보다 크다는 것은 중복하고 있는 값이 있는 레코드라는 것을 알 수 있습니다.

 

컬럼A가 중복하는 건수 취득

SELECT
	COUNT(컬럼A) duplicate_count
	, 컬럼A
FROM
	테이블 이름
GROUP BY
	컬럼A
HAVING
	COUNT(컬럼A) > 1

 

중복하는 값이 몇개인지 확인하고 싶은 경우에는 SELECTCOUNT(컬럼A)를 지정해주면 됩니다.

 

중복 레코드 모든 컬럼 취득

특정 컬럼으로 중복하는 값을 찾아 그 값의 모든 레코드를 다시 취득해야 하는 경우가 있습니다.

쿼리를 따로 만들어 2번 3번 실행 해도 되겠지만 한 번에 취득할 수도 있습니다.

중복하는 컬럼A와 모든 컬럼 취득

SELECT
	*
FROM
	테이블 이름
where
	컬럼A in (
		SELECT
			컬럼A
		FROM
			테이블 이름
		GROUP BY
			컬럼A
		HAVING
			COUNT(컬럼A) > 1
	)
ORDER BY
	컬럼A

 

WHERE 절에서 검색 조건으로 중복하는 값만 취득하도록 해오고 있습니다.

IN을 사용했기 때문에 성능이 떨어질 수도 있으니 미리 테스트를 하고 사용하는 것이 좋습니다.

댓글