[mariaDB/mysql] 중복데이터 조회 및 삭제하기

2021. 9. 2. 10:55IT개발/Database

반응형

통계데이터를 다루는데 중복데이터가 존재하여 삭제해야할 필요가 생겼다.

하여 아래와 같이 몇개 쿼리를 만들어 보았다.

/* 중복데이터 조회하기1 (총 중복대상이 몇개인지 파악하기) */
SELECT DF_CD, YEAR, MONTH, PORT, PRD_CD, CNT, AMOUNT, STD_DE, COUNT(ID)
FROM w_stats1
GROUP BY DF_CD, YEAR, MONTH, PORT, PRD_CD, CNT, AMOUNT, STD_DE
HAVING COUNT(ID) >1

/* 중복데이터 조회하기2 (중복되는 녀석들이 대체 어떤녀석들인지 멱살좀잡아보기) */
SELECT 
*
FROM w_stats1 A, 
(
	SELECT DF_CD, YEAR, MONTH, PORT, PRD_CD, CNT, AMOUNT, STD_DE, COUNT(ID)
	FROM w_stats1
	GROUP BY DF_CD, YEAR, MONTH, PORT, PRD_CD, CNT, AMOUNT, STD_DE
	HAVING COUNT(ID) >1
) B
WHERE A.DF_CD = B.DF_CD 
	AND A.YEAR = B.YEAR 
	AND A.MONTH = B.MONTH 
	AND A.PORT = B.PORT 
	AND A.PRD_CD = B.PRD_CD 
	AND A.CNT = B.CNT 
	AND A.AMOUNT = B.AMOUNT 
	AND A.STD_DE = B.STD_DE
ORDER BY A.DF_CD, A.YEAR, A.MONTH, A.PORT, A.PRD_CD, A.CNT, A.AMOUNT, A.STD_DE

/* 중복데이터 중 ID와 늦게 추가된 MAX(ID) 조회하기  */
SELECT ID, MAX(ID), COUNT(ID)
FROM w_stats1
GROUP BY DF_CD, YEAR, MONTH, PORT, PRD_CD, CNT, AMOUNT, STD_DE
HAVING COUNT(ID) >1

/* 중복데이터 중 늦게 추가된 MAX(ID) 삭제하기  */
DELETE A 
FROM w_stats1 A 
	INNER JOIN (SELECT MAX(ID) AS ID
		FROM w_stats1
		GROUP BY DF_CD, YEAR, MONTH, PORT, PRD_CD, CNT, AMOUNT, STD_DE
		HAVING COUNT(ID) >1) B
		ON A.ID = B.ID

/* 중복데이터 조회하기1 */ 실행시 화면

위 캡쳐화면과 같이 2개 이상의 중복데이터를 502 건 확인할수 있다.

자 이제 지워보자! 지우긴 지워야겠는데 기준이 있어야겠지?

더 늦게 들어간 녀석들을 지우자! 더늦게 들어갔다는 말은 ID 가 자동증분되니 둘중 MAX값이겠군!

/* 중복데이터 중 늦게 추가된 MAX(ID) 삭제하기  */ 실행하면 끝!

반응형