Home [MySQL] 윈도우 함수(Window Function)
Post
Cancel

[MySQL] 윈도우 함수(Window Function)

윈도우 함수(Window Function)

  • 그룹 함수들에 대해서 데이터 처리를 간단하게 하기 위한 함수이다.
  • 윈도우 함수는 중첩해서 사용할 수 없다.
  • 윈도우 함수는 OVER 구문이 필수로 포함되어야 한다.
  • 윈도우 함수를 OLAP 함수라고도 한다.

윈도우 함수 분류

분류종류
순위 함수그룹 내의 순위를 계산하는 함수, RANK, DENSE__RANK, ROW_NUMBER
집계 함수그룹 내의 값을 집계하는 함수, SUM, MAX, MIN, AVG, COUNT
순서 함수그룹 내의 행의 순서를 구하는 함수, FIRST_VALUE, LAST_VALUES, LAG, LEAD
비율 함수그룹 내의 비율을 구하는 함수, CUME_DIST, PERCENT_RANK, NTILE, RATIO_TO_REPORT

윈도우 함수 문법

1
2
3
4
5
6
7
8
SELECT
  WINDOW_FUNCTION(ARGUMENTS)
  OVER(
    [PARTITION BY 컬럼]
    [ORDER BY ]
    [WINDOWING ]
  )
 FROM 테이블명;
  • WINDOW_FUNCTION : 함수명
  • ARGUMENTS(인수) : 함수에 따라 0 ~ N개의 인수가 지정될 수 있다.
  • PARTITION BY 절 : 전체 집합을 기준에 의해 소그룹으로 나눌 수 있다.
  • ORDER BY 절 : 어떤 항목에 대해 순위를 지정할 지 ORDER BY절을 기술한다.

주의

  • PARTITION BY를 통해 그룹별 집계가 가능하다. 즉, 그룹이 바뀔 때마다 집계가 초기화되어 새롭게 계산된다.
  • ORDER BY를 사용할 경우 순차적누적 값이 계산된다. 사용할 때와 사용하지 않을 때를 잘 구분해야 한다.

그룹 내 순위(RANK) 관련 함수

RANK

  • ORDER BY를 포함한 쿼리문에서 특정 컬럼에 대한 순위를 구하는 함수이다.
  • 동등한 순위가 나왔을 때 동등한 순위 수만큼 건너 뛰고 순위를 계산한다. ex) 1, 2, 3, 3, 5

DENSE_RANK

  • RANK 함수와 비슷하지만, 동일한 순위를 하나의 건수로 취급한다.
  • 동등한 순위가 나왔을 때 바로 다음 순위가 나온다. ex) 1, 2, 3, 3, 4

ROW_NUMBER

  • RANK나 DENSE_RANK 함수가 동일한 값에 대해 동일한 순위를 부여하는데에 반해, 동일한 값이더라도 고유한 순위를 부여한다.
  • 동등한 순위를 무시한다. ex) 1, 2, 3, 4
학번학과이름점수
1000전산철수70
2000전기영준85
3000전자진호95
4000전산영진100
5000전자현영85
1
2
3
4
5
6
SELECT
  학번, 이름, 점수, 
  RANK() OVER(ORDER BY 점수 DESC) AS '순위1',
  DENSE_RANK() OVER(ORDER BY 점수 DESC) AS '순위1',
  ROW_NUMBER() OVER(ORDER BY 점수 DESC) AS '순위3'
FROM 학생;
학번이름점수순위1순위2순위3
4000영진100111
3000진호95222
5000현영85333
2000영준85334
1000철수70545

그룹 내 행 순서 관련 함수

FIRST_VALUE

  • 파티션별 윈도우에서 가장 먼저 나온 값을 구한다.
  • MIN 함수를 활용하여 같은 결과를 얻을 수 있다.

LAST_VALUE

  • 파티션별 윈도우에서 가장 나중에 나온 값을 구한다.
  • MAX 함수를 활용하여 같은 결과를 얻을 수 있다.

LEAD

  • 파티션별 윈도우에서 이후 몇 번째 행의 값을 가져올 수 있다.
  • 즉, 아래에 있는 값을 가져온다.

LAG

  • 파티션별 윈도우에서 이전 몇 번째 행의 값을 가져올 수 있다.
  • 두 번째 인자는 몇 번째 앞의 행을 가져올 지 결정한다.
  • 세 번째 인자는 값이 없을 때 다른 값으로 변경한다.
  • 즉, 에 있는 값을 가져온다.


  • FIRST_VALUE, LAST_VALUE 사용 예시
1
2
3
4
5
SELECT
  학번, 이름, 점수,
  FIRST_VALUE(이름) OVER(ORDER BY 점수 DESC) AS F_VAL,
  LAST_VALUE(이름) OVER(ORDER BY 점수 DESC) AS L_VAL
FROM 학생;
학번이름점수F_VALL_VAL
4000영진100영진철수
3000진호95영진철수
5000현영85영진철수
2000영준85영진철수
1000철수70영진철수
  • LEAD, LAG 사용 예시
1
2
3
4
5
SELECT
  학번, 이름, 점수,
  LAG(이름) OVER(ORDER BY 점수 DESC) AS LAG,
  LEAD(이름) OVER(ORDER BY 점수 DESC) AS LEAD
FROM 학생;
학번이름점수LAGLEAD
4000영진100NULL진호
3000진호95영진현영
5000현영85진호영준
2000영준85현영철수
1000철수70영준NULL

그룹 내 비율 관련 함수

CUME_DIST

  • 파티션별 윈도우의 전체 건수에서 현재 행보다 작거나 같은 건수에 대한 누적백분율을 구한다.

PERCENT_RANK

  • 파티션별 윈도우에서 제일 먼저 나오는 것을 0으로, 제일 늦게 나오는 것을 1로 하여, 값이 아닌 행의 순서별 백분율을 구한다.

NTILE

  • 파티션별 전체 건수를 인수 값으로 N등분한 결과를 구할 수 있다.
  • NTILE을 활용하면 등분하여 순위를 매길 수 있다.
  • NTILE(3) : 상중하
  • NNTILE(2) : 상위, 하위

RATIO_TO_REPORT

  • 파이션 내 전체 SUM(컬럼) 값에 대한 행별 컬럼 값의 백율을 소수점으로 구할 수 있다.
This post is licensed under CC BY 4.0 by the author.