Programming Language

2. SQL 추가 기능 - Window Function

wakelight23 2024. 10. 18. 18:11

Window Function?

● 각 행의 관계를 정의하기 위한 함수

   → 그룹 내의 연산을 쉽게 만들어줌

 

언제 사용할까?

 - 한 지역 식당 중 음식 종류에 따라 순위를 매기고 싶을 때

 - 음식 종류에 따른 전체 주문건수 중 A 식당이 차지하는 비율 등...

 

기본 SQL 구조로 해결하려면 복잡하게 SubQuery 문을 사용하거나
   여러 번의 연산을 수행해줘야 하지만, Window Function을 이용하면 조금 더 편리하게 표현 가능

 

● 기본 구조

WINDOW_FUNCTION(argument) over (partition by 그룹 기준 칼럼 order by 정렬 기준)

- WINDOW_FUNCTION : 기능 명을 사용 (=SUM, AVG)

- argument : 함수에 따라 작성 or 생략

- partition by : 그룹을 나누기 위한 기준 (=GROUP BY와 유사)

- order by : Window Function 을 적용할 때 정렬할 칼럼 기준

 

● 어떻게 사용할까?

- N 번째까지의 대상을 조회하고 싶을 때 -  RANK

- RANK : 특정 기준으로 순위를 매겨주는 기능

- RANK를 사용해서 주문 건수별 순위 매기기, 결제 시간이 빠른 순서로 순위 매기기 등이 가능

 

예시 문제 : 음식 종류별로 주문 건수가 가장 많은 음식점 3개씩 조회하기

 

1. 음식 종류별, 음식점별 주문 건수 집계

SELECT 음식종류,
               음식점명,
               COUNT(1) 주문건수
FROM 주문정보
GROUP BY 1, 2

- SubQuery에서 사용할 테이블은 '주문정보'

- '음식 종류별', '가장 많은 음식점', '주문 건수' 키워드에 맞게 음식종류, 음식점명, 주문건수 칼럼 조회

- 음식종류와 음식점며을 기준으로 그룹화

 

2. RANK 함수 적용

SELECT 음식종류,
              음식점명,
              RANK() over (partition by 음식종류 order by 주문건수 DESC) rank

- Window Function 중 하나인 RANK의 사용

- 음식종류를 RANK 함수에 따라 주문건수 수만큼 오름차순 정리

 

3. 전체 구문

SELECT 음식종류,
               음식점명,
               주문건수,
               rank "순위"
FROM
           (
            SELECT 음식종류,
                         음식점명,
                         RANK() over (partition by 음식종류 order by 주문건수 DESC) rank
           FROM 
                     (
                      SELECT 음식종류,
                                    음식점명,
                                    COUNT(1) 주문건수
                     FROM 주문정보
                      GROUP BY 1, 2
                     ) a
           ) b
WHERE rank <= 3
ORDER BY 1, 4

- 최종적으로 나와야 하는 값들은 '순위' 칼럼 안에 3등 이내의 음식점들

- 'COUNT(1) 주문건수'에 따라 음식점별로 도출된 주문건수로 순위 결정

- 음식종류별로 1~3등까지 등수가 매겨지면 완성