중복 제거: SQL로 효율적으로 데이터 정리하기

데이터 분석 과정에서 중복 데이터를 처리하는 일은 매우 흔합니다. 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_idemailcreated_at
1example1@test.com2025-01-15 12:34:56
2example2@test.com2025-01-14 11:22:33

3. 중복된 데이터만 조회: GROUP BYHAVING 사용

중복된 데이터를 찾고 싶다면 GROUP BYHAVING 구문을 활용합니다.

예제

이메일이 중복된 사용자 목록을 조회하는 예제:

SELECT email, COUNT(*) AS count
FROM users
GROUP BY email
HAVING COUNT(*) > 1;

결과

emailcount
duplicate@test.com3

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에서 중복 데이터를 제거하는 다양한 방법을 살펴보았습니다. 상황에 맞는 방법을 선택해 효율적으로 데이터를 관리해 보세요! 위 예제는 복사하여 바로 사용할 수 있으니, 필요할 때 유용하게 활용하시길 바랍니다. 😊


게시됨

카테고리

작성자

댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다