[SQL] WINDOWS FUNCTION - RANK

2024. 8. 21. 19:28Language/SQL

 지금까지 배운 SQL 함수들로 다양한 조건을 만족하는 결과를 조회하는 쿼리문들을 작성했지만 이보다 더 쉽게, 시간을 절약할 수 있게끔 도와주는 'WINDOWS FUNCTION' 에 대하여 정리해보려 한다. '윈도우 함수' 라고도 불리는데 해당 함수에는 하나의 함수가 아닌 여러 함수들의 집합으로 '윈도우 함수' 에 해당하는 여러 함수들이 있다. 한 번에 모든 함수들을 정리하기보다 필요에 따라 학습하게 된 '윈도우 함수' 를 그 때마다 추가로 정리할 생각이다.

 

1. 기본 문법

SELECT 윈도우함수명(지정칼럼명) OVER (PARTITION BY 분류할 컬럼명 ORDER BY 정렬 기준)

 

 'WINDOWS FUNCTION' 은 각 행의 관계를 정의하기 위한 함수라고 한다. 일반적으로 위와 같은 방식으로 사용된다. '(지정칼럼명)' 같은 경우 함수에 따라 생략이 가능하다.

 

 

2. 사용 예시

2-1. RANK

 'food_orders' 테이블에서 '음식종류-음식점명' 그룹의 총 주문건수에 대한 음식종류 별 순위를 매기는 쿼리를 작성해보자.

SELECT cuisine_type, restaurant_name,
       RANK() OVER (PARTITION BY cuisine_type ORDER BY order_count DESC) ranking
FROM
(
SELECT cuisine_type, restaurant_name, count(cuisine_type) order_count
FROM food_orders
GROUP BY 1, 2
) f

순위 매기기 결과

 

'RANK' 의 경우 그룹화 된 데이터의 정렬된 컬럼 값에 대해 순위를 매겨주는 함수이다. 예시에 사용된 SQL 을 하나씩 뜯어 보자.

 

먼저 눈에 띄는 것은 'OVER' 인데 해당 함수는 'WINDOWS FUNCTION' 중 하나특정 집합에 대해 앞에 지정한 'WINDOWS FUNCTION(해당 예시에선 RANK)' 을 적용하는 기능을 한다. 즉 '( )' 안의 조건을 만족하는 집합에 대해 순위를 매기게 되는 것이다. 찾아본 바 다들 'GROUP BY' 와 많이 비교하던데 개인적으로는 'HAVING' 과 비교하는 것이 더 좋지 않나 생각한다. 둘다 그룹에 적용하는 역할을 하기 때문이다.

 

두 번째로는 'PARTITION BY' 이다. 해당 함수는 지정한 컬럼의 값에 따라 집합을 나누는 기능을 한다. 예시의 경우 '음식종류' 컬럼을 지정하였기에 전체 레코드가 '음식종류'에 따라 분리(하나의 집합이 나누어졌으니) 되었으며 여기서 그룹화는 'GROUP BY' 와 다르게 분류의 느낌이다(GROUP BY 는 한 곳으로 뭉치는 느낌). 세 번 째로 'ORDER BY' 의 경우 기존 SQL 의 것과 같은 기능을 한다.

 

이렇게 OVER 에, 함수를 적용할 기준이 정의 되었으며, 풀어서 말하면 "음식 종류별로 주문 수가 많은 순으로 순위를 매겨줘" 가 되는 것이다. 모든 결과가 담긴 이미지를 첨부하진 못 했지만 결과를 설명하면 'American', 'Korean' 등 각 음식종류마다 순위가 따로 매겨졌으며, 해당 순위는 주문수가 많은 순으로 매겨졌다(주문수가 많은 데이터가 1위).