본문 바로가기
Database/MySQL

[MySQL]중복 제거 시 사용하는 DISTINCT

by sukii 2025. 4. 3.
반응형

🤔 DISTINCT란?

DISTINCT는 중복된 행을 제거하여 유일한 결과만 반환한다.
기본 문법은 아래와 같음.

SELECT DISTINCT 컬럼1, 컬럼2, ...
FROM 테이블명;

 

 

👨‍💻 DISTINCT 예시

SELECT DISTINCT 
    o.customer_id, 
    o.order_id, 
    o.delivery_status,
    COUNT(o.product_id) OVER (
        PARTITION BY o.customer_id, o.order_id, o.delivery_status
    ) AS product_count
FROM orders o
WHERE o.is_cancelled = 'N';

 

DISTINCT를 활용해, 고객 ID, 주문 ID, 배송 상태가 동일한 경우 중복을 제거하고 고유한 조합만 결과에 포함한다.

 

💡근데 여기서 중요한건 DISTINCT 바로 뒤에 나오는 customer_id 컬럼만 기준으로 중복제거를 하는 것이 아니라, o.customer_id +  o.order_id + o.delivery_status 이 세개의 조합이 모두 중복되는 행만 제거하는 것이다.

 

그러므로 만약 o.customer_id 컬럼을 기준으로만 DISTINCT하면서, 나머지 두 컬럼(o.order_id / o.delivery_status)을 조회하고 싶다면 아래와 같이 GROUP BY를 사용해서 중복제거를 해야한다.

 

⚫ GROUP BY

SELECT 
    o.customer_id, 
    MAX(o.order_id) AS latest_order_id,
    MAX(o.delivery_status) AS delivery_status
FROM orders o
WHERE o.is_cancelled = 'N'
GROUP BY o.customer_id;

 

⚫ 윈도우 함수

윈도우 함수를 사용하여 중복 제거는 아니더라도 같은 결과를 도출할 수 있다. 예를 들어 고객별로 가장 최근 주문 한 건만 조회하고 싶을 때, 아래와 같이 ROW_NUMBER() 윈도우 함수를 사용할 수 있다.

SELECT customer_id, order_id, delivery_status
FROM (
    SELECT *,
           ROW_NUMBER() OVER (
               PARTITION BY customer_id 
               ORDER BY order_date DESC
           ) AS rn
    FROM orders
    WHERE is_cancelled = 'N'
) ranked
WHERE rn = 1;

 

 

 

🤷‍♀️결론

👉 모든 값이 완전히 똑같은 행이 여러 개 있다면?DISTINCT를 써서 겹치는 건 하나만 남기기

👉 특정 컬럼(name, id 등) 기준으로 묶고, 그 안에서 대표 값을 하나만 보고 싶다면?GROUP BY를 써서 MAX, MIN 같은 함수로 대표 값을 뽑아주기

👉 그룹으로 묶긴 묶되, 가장 최근 거나 조건에 맞는 딱 하나만 골라보고 싶다면?ROW_NUMBER() 같은 윈도우 함수를 써서 내가 원하는 기준으로 한 건만 선택 가능

 

반응형

'Database > MySQL' 카테고리의 다른 글

[MySQL]DATE_FORMAT 함수  (0) 2024.08.30
[MySQL] IFNULL 함수 (Oracle의 NVL과 같은 역할)  (0) 2024.06.04