테이블에 중복된 데이터가 있을 때 중복된 데이터에서 한개만 남기고 나머지를 제거해야 하는 이슈가 있었다.
여기서 중복이라는 것은 유일할 것이라고 생각하는 컬럼의 데이터가 여러개 있을 경우를 말한다. (애초에 pk 또는 unique key를 잡았다면 문제가 없었을 것이다.)
DELETE FROM table_name
where ctid in (
SELECT A.ctid
FROM (
SELECT ctid,
ROW_NUMBER() over (PARTITION BY column_name ORDER BY column_name desc) AS num
FROM table_name
) A
WHERE A.num > 1
)
중복을 제거할 테이블에서 중복 체크할 컬럼을 PARTITION
으로 묶어 ORDER BY
순으로 번호를 매기고, 1번을 제외한 모든 row를 제거하는 SQL문이다. ctid
는 테이블 내부 행 버전의 물리적 위치를 나타낸다.
만약 중복 체크할 컬럼이 여러개라면 PARTITON BY
뒤에 모두 적어주면 된다.
PARTITION BY column_name1, column_name2, column_name2 ORDER BY column_name desc
'Database > RDBMS' 카테고리의 다른 글
[PostgreSQL] 읽기 전용 유저 생성 (0) | 2023.04.27 |
---|---|
[PostgreSQL] VIEW vs MVIEW(Materialized View) (0) | 2022.08.19 |
[PostgreSQL] JSON 컬럼에 특정 값만 추출해서 Index를 걸어보자 (0) | 2022.08.12 |