🤔 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 |