Data Engineering/SQL

[SQL] 중복된 데이터 행 제거

돌돌찐 2024. 4. 1. 07:37

데이터를 이관하는 과정에서 프로시저를 자동화 했는데,

로직이 잘못 되었었는지 같은 데이터가 중복으로 삽입되어 있었다.

 

이를 삭제하기 위한 쿼리를 기록해본다.

 

일반적으로 고유한 값을 가지는 id로만 데이터를 구분하여 삭제하는 쿼리 예시는 많이 있었는데,

내가 겪은 케이스의 경우 id 값이 유일하지 않았다.

 

그래서 유일해야하는 id값과 컬럼 중 데이터 값이 유일하게 달랐던 데이터 삽입 시간 created_datetime을 기준으로 구분했다.

DELETE FROM table1
WHERE (id, created_datetime) IN (
	SELECT id, created_datetime
    FROM (
    	SELECT id, created_datetime
        	,ROW_NUMBER() OVER (PARTITION BY id
                ,...
                ,...
                ,...
                ,...
            	ORDER BY id) row_num
        FROM table1
    ) sub_tb
    WHERE row_num >1
);

 

여기에서 같은 테이블의 데이터를 바로 지우는 것은 안되기 때문에 서브쿼리로 만들어 주고 난 다음 지워줘야 한다. (sub_tb)

 

유일한 값인 컬럼을 WHERE 조건에 걸어주지 않으면,

(예를 들어 id 값이 유일하지 않고 중복으로 있었으나, id 값만 걸어준다면)

row_num > 1 의 조건을 주었다고 하더라도 같은 값은 전부 삭제가 되어 버린다.

(즉 중복 데이터가 3행이 있었다면 row_num 2, 3 만 지우는 쿼리라도 WHERE 조건에 유일한 컬럼 값이 걸려 있지 않으면 다 삭제 됨)

 

자칫 실수 할 수 있는 부분이고, 내가 실수했다..ㅎㅎ..ㅠㅠ

조심!!!!

 

추가적으로 알아볼 부분은, MPP기반의 REDSHIFT에서 DDL문에 PK값으로 id를 걸어주었었는데,

중복 데이터가 들어가 있었던 것이다.

 

이 부분은 추가적으로 알아봐야할 것 같다.