[MySQL] 윈도우 함수 (Window Function)
자꾸 문법을 헷갈려서 잘 이용하지 못한 윈도우 함수..............
윈도우 함수에 대해 정리해보자.
그리고 또 시험에 윈도우 함수가 나온다면 그때는 꼭 잘 사용해보자..!!!!
1. 윈도우 함수(Window Function)란?
행의 그룹을 만들고 그룹 내에서 계산을 수행하는 기능을 제공하는 함수이다.
기본 형태는 다음과 같다.
함수(함수_적용_열) OVER (PARTITION BY 그룹열 ORDER BY 순서열)
- 순위 함수의 경우, 함수의 인자가 필요하지 않다.
- PARTITION BY를 기준으로 그룹을 생성하며 ORDER BY를 기준으로 정렬해준다.
- PARTITION BY, ORDER BY에 넣을 값이 없다면 빈 괄호로 두면 된다.
2. 윈도우 함수의 종류
집계 함수
SUM(), MIN(), MAX(), AVG(), COUNT() 를 활용할 수 있다.
PARTITION BY의 기준별로 나눈 것처럼 결과를 보여주며, ORDER BY의 단위로 집계한다.
예를 들어 프로그래머스 즐겨찾기가 가장 많은 식당 정보 출력하기 (Lv.3) 에서 아래 쿼리를 통해 FOOD_TYPE별 FAVORITES 수의 누적합을 구할 수 있다.
SELECT FOOD_TYPE
, REST_NAME
, FAVORITES
, SUM(FAVORITES) OVER (PARTITION BY FOOD_TYPE ORDER BY REST_ID) AS FAV_SUM
FROM REST_INFO
실행 결과는 다음과 같다. (일부분)
순위
ROW_NUMBER(), RANK(), DENSE_RANK()가 있다. ORDER BY에 순위의 기준을 지정해주어야 한다.
차이점은 다음과 같다.
- ROW_NUMBER() : 순위 중복 X. 행 번호와 동일
- RANK() : 순위 중복 O. 공동 순위만큼 건너 뜀
- DENSE_RANK() : 순위 중복 O. 공동 순위를 건너 뛰지 않음
RANK를 이용하여 FOOD_TYPE별 FAVORITES의 순위를 구하는 쿼리를 작성해보았다. (동일 문제)
SELECT FOOD_TYPE
, REST_NAME
, FAVORITES
, RANK() OVER (PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC) AS FAV_SUM
FROM REST_INFO
실행 결과는 다음과 같다. (일부분)
데이터 위치 변경
LAG(), LEAD()가 있다. LAG는 n칸 미루는 함수, LEAD는 n칸 당기는 함수이다.
집계함수의 인자에 열, n, 결측값을 채울 값이 들어간다. n의 기본값은 1, 결측값의 기본값은 null이다.
같은 문제에서 REST_NAME을 한 칸 씩 미뤄보았다.
SELECT FOOD_TYPE
, REST_NAME
, LAG(REST_NAME) OVER () NAME_LAGGED
FROM REST_INFO
실행 결과는 다음과 같다. (일부분)
3. 연습 문제
아래 두 문제를 Window 함수를 활용하여 풀어보자.
참고자료