윈도우 함수란?

서로 다른 행의 비교나 연산을 위해 만든 함수

데이터를 분석하고 집계하는데 유용한 기능

전체 결과 집합에서 각 행에 다한 계산을 수행할 수 있음

 

  • GROUP BY을 쓰지 않고 그룹 연산 기능
  • LAG, LEAD, SUM, AVG,MIN,MAX, COUNT, RANK

문법

SELECT 윈도우함수([대상]) OVER([PARTITION BY 컬럼]
        	              [ORDER BY 컬럼 ASC|DESC]
        	              [ROWS|RANGE BETWEEN A AND B])

 

  • PARTITION BY
    • 출력할 데이터 수 변화 없이 그룹연산 수행할 GROUP BY 컬럼
  • ORDER BY
    • RANK의 경우 필수 ( 정렬 컬럼 및 정렬 순서에 따라 순위 변화)
    • SUM, AVG, MIN, MAX, COUNT 등은 누적값 출력 시 사용
  • [ROWS|RANGE BETWEEN A AND B]
    • 연산 범위 설정
    • ORDER BY절 필수

순서 중요

누적합은 ORDER BY 필수

 

 

ROWS, RANGE 차이

  • ROWS : 값이 같더라도 각 행씩 연산
  • RANGE : 같은 값의 경우 하나의 RANGE로 묶어서 동시 연산(DEFAULT)

 

BETWEEN A  AND B

RANGE설정 시 반드시 범위 설정 필요

  • 시작점 정의 - A
    • CURRENT ROW : 현재행부터
    • UNBOUNDED PRECENDING : 처음부터(DEFAULT)
    • N PRECEDING : N 이전부터
  • 마지막 지점 - B
    • CURRENT ROW : 현재행까지 (DEFAULT)
    • UNBOUNDED FOLLOWING : 마지막까지
    • N FOLLOWING : N 이후까지

 

순서 관련함수

RANK WIDTHIN GROUP

  • 특정값에 대한 순위 확인
  • 윈도우함수는 아님
SELECT RANK(값) WITHIN GROUP(ORDER BY 컬럼)

 

RANK() OVER()

  • 전체 중/ 특정 그룹 중 값의 순위 확인
  • ORDER BY 필수
  • 순위를 구할 대상을 ORDER BY절에 명시(여러 개 나열 가능)
  • 그룹 내 순위 구할 시 PATITION BY절 사용
SELECT RANK() OVER([PARTITION BY 컬럼]
                ORDER BY 컬럼 ASC|DESC)

 

DENSE_RANK

  • 누적순위
  • 값이 같을 때 동일한 순위 부여 후 다음 순위가 바로 이어지는 순위 부여 방식

 

ROW_NUMBER

  • 연속된 행 번호
  • 동일한 순위를 인정하지 않고 단순히 순서대로 나열한 대로 순서 값 리턴

 

예시

SELECT 
    학생ID, 
    이름, 
    점수,
    RANK() OVER (ORDER BY 점수 DESC) AS RANK,
    DENSE_RANK() OVER (ORDER BY 점수 DESC) AS DENSE_RANK,
    ROW_NUMBER() OVER (ORDER BY 점수 DESC) AS ROW_NUMBER
FROM 학생점수;


RANK, DENSE_RANK, ROW_NUMBER 비교

학생ID 이름 점수 RANK DENSE_RANK ROW_NUMBER
1 철수 90 1 1 1
3 민수 90 1 1 2
2 영희 80 3 2 3
5 하늘 80 3 2 4
4 지민 70 5 3 5

 

LAG, LEAD

  • 행 순서대로 각각 이전 값(LAG), 이후값(LEAD) 가져오기
  • ORDER BY 필수

 

FIRST VALUE, LAST_VALUE

  • 정렬 순서대로 정해진 범위에서의 처음 값, 마지막 값 출력
  • 순서와 범위 정의에 따라 최소값과 최댓값 리턴

 

NTILE

  • 행을 특정 컬럼 순서에 따라 정해진 수의 그룹으로 나누기 위한 함수
  • 그룹 번호가 리턴됨
  • ORDER BY절 필수
  • PRTITION BY 사용하여 특정 그룹을 또 원하는 수만큼 그룹 분리 가능
SELECT NTILE(N) OVER([PARTITION BY 컬럼]
				ORDER BY 컬럼 ASC|DESC)

 

비율 관련 함수

RATIO_TO_TRPORT

  • 각 값의 비율 리턴
  • ORDER BY 절 사용 불가

 

CUME_DIST

누적비율 

  • 각 값의 누적 비율 리턴 (누적 백분율)
  • ORDER BY필수 (누적 비율 구하는 순서 정할 수 있음)

 

PERCENT_PANK

분위수

  • 분위수 출력
  • 전체 COUNT 중 상대적 위치 출력 (0~1 출력)
  • ORDER BY필수
  • 파티션 별로 제일 먼저 나오는것이 0 , 제일 나중에 나오는것이 1 => 백분율

 

RATIO_TO_TRPORT, CUME_DIST, PERCENT_PANK 비교

col1 RATIO_TO_REPORT CUME_DIST PERCENT_RANK
10 0.1 0.6 0.0
10 0.1 0.6 0.0
10 0.1 0.6 0.0
20 0.2 0.8 0.75
50 0.5 1.0 1.0

 

SELECT 
    col1,
    RATIO_TO_REPORT(col1) OVER() AS RATIO_TO_REPORT,
    CUME_DIST() OVER(ORDER BY col1) AS CUME_DIST,
    PERCENT_RANK() OVER(ORDER BY col1) AS PERCENT_RANK
FROM 
    TB1;

'SQL > SQL 이론' 카테고리의 다른 글

[SQL] 서브쿼리  (0) 2024.10.29
[SQL] 연산자 - between and, in, like, is null  (0) 2024.05.17
[SQL] WHERE 조건에 해당하는 데이터 조회  (0) 2024.05.17
[SQL] SELECT~ FROM 데이터 조회  (0) 2024.05.17