내일배움캠프/SQL

[SQL]Window Function_RANK, SUM

dydatablog 2024. 11. 18. 17:45
728x90

Window함수란? : 각 행의 관계를 정의하기 위한 함구로 그룹 내의 연산을 쉽게 만들어 준다.

 예시)

  • 한식 식당 중에서 주문건수가 많은 순으로 순위를 매기고 싶을 때
  • 한식 식당 전체 주문건수 중에서 A식당이 차지하는 비율을 알고 싶을 때
  • 2건 이상 주문을 한 소비자 중에, 처음 주문한 식당과 2번째로 주문한 식당을 같이 조회하고 싶을 때

→ 기본 SQL 구조로 해결할 수도 있지만 여러 Subquery문을 이용해야 한다. 

 

Window Function의 기본 구조

window_function(argument) over (partition by 그룹 기준 컬럼 order by 정렬 기준)
  • window_function : 기능 명을 사용해줍니다. (sum, avg 와 같이 기능명이 있습니다)
  • argument : 함수에 따라 작성하거나 생략합니다.
  • partition by : 그룹을 나누기 위한 기준입니다. group by 절과 유사하다고 생각해주시면 됩니다.
  • order by : window function 을 적용할 때 정렬 할 컬럼 기준을 적어줍니다.

[실습1] N 번째까지의 대상을 조회하고 싶을 때, Rank

음식 타입별, 음식점별 주문 건수 집계하고, 3위까지 조회, 음식 타입별, 순위별로 정렬하기

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

 

[실습2] 전체에서 차지하는 비율, 누적합을 구할 때, Sum

음식 타입별, 음식점별 주문 건수 집계하고, 카테고리별 합, 카테고리별 누적합 구하기

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
728x90