[ORACLE] ROW_NUMBER() 중복되는데이터는 하나로 처리하기 (그룹별로 순번을 지정하여 하나의 행만 추출)
ROW_NUMBER() OVER (PARTITION BY ~
그룹별로 순번을 지정하여 하나의 행만 추출
ROW_NUMBER() 함수
SQL에서 사용되는 윈도우 함수(window function) 중 하나이다
윈도우 함수는 테이블의 행들에 대해 계산을 수행하고, 결과 집합에 추가적인 정보를 제공하는 특별한 함수이다
ROW_NUMBER() 함수는 각 행에 일련 번호를 할당된다
이 번호는 정렬 순서에 따라 할당되며, 일반적으로 정렬 기준은 ORDER BY 구문을 통해 지정된다
ex> 다음 쿼리는 고객별로(customer_id)별로 최근 주문 (order)의 인련번호를 확일 할 수 있다.
SELECT order_id, customer_id, order_date,
ROW_NUMBER() OVER(
PARTITION BY customer_id ORDER BY order_date DESC) AS rn
FROM orders;
>실행후
ROW_NUMBER() 함수를 사용하여 rn 열을 추가한다
(ROW_NUMBER() 함수를 사용하여 번호를 할당할 때, 그룹 내에서 정렬 순서에 따라 번호를 부여하게 된다 .
따라서 ROW_NUMBER() 함수를 사용하면 각 그룹의 첫 번째 행부터 시작하여 순서대로 번호가 부여된다.)
PARTITION BY customer_id 구문을 사용하여 각 고객(customer)별로 그룹을 만들고,
ORDER BY order_date DESC 구문을 사용하여 주문일(order_date)을 내림차순으로 정렬합니다.
ex> oders테이블에서 고객별로 가장 최근 날짜로 주문한 정보 보여주기
SELECT A.*
FROM (
SELECT order_id, customer_id,order_date, ROW_NUMBER() OVER (
PARTITION BY customer_id ORDER BY order_date DESC) AS rn
FROM orders ) A
WHERE A.rn = 1;
>실행후
order_id 6는 customer_id 101의 가장 최근 주문을 나타내며, 해당 주문은 2022년 4월 1일(order_date)에 발생
order_id 5는 customer_id 102의 가장 최근 주문을, 해당 주문은 2022년 3월 10일에 발생
order_id 4는 customer_id 103의 가장 최근 주문을 나타내며, 해당 주문은 2022년 3월 5일에 발생