데이터 분석 과정에서 중복 데이터를 처리하는 일은 매우 흔합니다. SQL을 사용하면 효율적으로 중복 데이터를 제거하거나, 중복되지 않은 데이터를 조회할 수 있습니다. 이번 포스팅에서는 다양한 중복 제거 방법과 실제 예제를 소개합니다.

1. 중복되지 않은 데이터 조회: DISTINCT
사용
SQL에서 중복을 제거할 때 가장 기본적으로 사용하는 구문은 DISTINCT
입니다. 특정 열의 중복된 값을 제거하고 고유한 값을 조회할 수 있습니다.
예제
다음은 사용자 테이블에서 중복되지 않은 국가 목록을 조회하는 예제입니다:
SELECT DISTINCT country
FROM users;
결과
country |
---|
Korea |
Japan |
USA |
2. 중복 행 제거: ROW_NUMBER
활용
ROW_NUMBER
함수는 중복된 행 중 하나만 유지하고 나머지는 제거할 때 유용합니다. 이 방법은 중복의 기준을 설정하고 고유한 행을 선택할 수 있습니다.
예제
같은 이메일을 가진 사용자 중 가장 최근에 가입한 사용자만 조회하는 예제:
WITH ranked_users AS (
SELECT
user_id,
email,
created_at,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY created_at DESC) AS row_num
FROM users
)
SELECT user_id, email, created_at
FROM ranked_users
WHERE row_num = 1;
결과
user_id | created_at | |
1 | example1@test.com | 2025-01-15 12:34:56 |
2 | example2@test.com | 2025-01-14 11:22:33 |
3. 중복된 데이터만 조회: GROUP BY
와 HAVING
사용
중복된 데이터를 찾고 싶다면 GROUP BY
와 HAVING
구문을 활용합니다.
예제
이메일이 중복된 사용자 목록을 조회하는 예제:
SELECT email, COUNT(*) AS count
FROM users
GROUP BY email
HAVING COUNT(*) > 1;
결과
count | |
duplicate@test.com | 3 |
4. 테이블에서 중복 제거: DELETE
구문 활용
테이블에서 중복된 데이터를 실제로 삭제하려면 DELETE
구문과 ROW_NUMBER
를 조합하여 사용합니다.
예제
같은 이메일을 가진 사용자 중 가장 오래된 데이터를 삭제하는 예제:
WITH ranked_users AS (
SELECT
user_id,
email,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY created_at ASC) AS row_num
FROM users
)
DELETE FROM users
WHERE user_id IN (
SELECT user_id
FROM ranked_users
WHERE row_num > 1
);
5. 중복 제거와 성능 최적화
중복 제거 작업은 데이터 크기가 커질수록 성능에 영향을 줄 수 있습니다. 다음 팁을 참고하세요:
- 인덱스를 활용하여 조회 성능을 개선합니다.
- 중복 제거 기준 열에 적절한 데이터 타입과 정규화를 적용합니다.
- 데이터가 지속적으로 중복 발생 시 ETL 프로세스를 검토합니다.
결론
SQL에서 중복 데이터를 제거하는 다양한 방법을 살펴보았습니다. 상황에 맞는 방법을 선택해 효율적으로 데이터를 관리해 보세요! 위 예제는 복사하여 바로 사용할 수 있으니, 필요할 때 유용하게 활용하시길 바랍니다. 😊
답글 남기기