데이터 분석/SQL

[SQL] 윈도우 함수 - RANK, 누적 합계 SUM

PARK JI HO 2023. 12. 21. 17:05

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은 음식 타입 별로 주문건수를 내림차순을 해서 낮은 순 정렬하고 누적 합을 구하는 것이다.