[SQL] 윈도우 함수 - RANK, 누적 합계 SUM
RANK
랭크 함수는 말 그대로 랭크(순위)를 매기는 함수
SELECT cuisine_type,
restaurant_name,
cnt_order,
ranking
FROM
(
SELECT cuisine_type,
restaurant_name,
cnt_order,
rank() over (partition by cuisine_type order by cnt_order desc) ranking
FROM
(
SELECT cuisine_type,
restaurant_name,
count(1)cnt_order
FROM food_orders
group by 1,2
)a
)b
where ranking <= 3
음식 타입별로 주문 건수가 가장 많은 상점을 3개씩 조회하는 것이 목표다.
우선 음식 타입, 상점 이름, 총 주문 건수를 구해주고 count를 했으니 group by를 해준다
그다음 rank를 함수를 사용해서 순위를 매겨줬다.
rank() over는 한 쌍이니까 외워두자
partition by는 지금 문제처럼 음식 타입별로 주문 건수를 구해야 할 때 partition by cuisine_type을 해주면 되는 느낌
over안에 쓰는 group by 느낌
rank() over (partition by cuisine_type order by cnt_order desc) ranking
이 부분을 해석해 보면 랭크를 매기는데 음식 타입별로 주문 건수를 내림차순 해서 랭크를 매기고
ranking에 할당하는 것
그러면 주문건수가 제일 많은 가게가 1등을 하겠지???
그다음 위 쿼리도 서브쿼리로 감싸주고 마지막에 음식 타입, 가게 이름, 주문건수, 랭킹을 출력해 주면 된다
아 마지막에 where 조건으로 3위까지만 출력
결과
이렇게 음식 타입별로 1등 2등 3등이 쭈욱 나오게 된다.
sum (누적 합계)
조회 순서대로 누적 합을 구할 때 사용한다.
-기본 구조
sum(컬럼1) over(partition by 컬럼2 order by 컬럼3)
연습
SELECT cuisine_type,
restaurant_name,
cnt_order,
sum(cnt_order) over(partition by cuisine_type) sum_cuisine,
sum(cnt_order) over(partition by cuisine_type order by cnt_order) cum_cuisine
FROM
(
SELECT cuisine_type,
restaurant_name,
count(1)cnt_order
FROM food_orders
group by 1,2
)a
order by cuisine_type, cnt_order
각 음식점의 주문 건이 해당 음식 타입에서 차지하는 비율을 구하고, 주문 건이 낮은 순으로 정렬했을 때 누적 합 구하기
일단 음식 타입, 상점 이름별로 주문 건수를 구해주자
그다음 누적 합계 sum() over()를 이용하여 누적 합을 구하면 된다
그다음 누적 합계와 주문 건수를 나눠주면 차지하는 비율을 구할 수 있다.
아래의 cum_cuisine은 음식 타입 별로 주문건수를 내림차순을 해서 낮은 순 정렬하고 누적 합을 구하는 것이다.