본문 바로가기
🖊️Certificate/📌SQLD

[SQLD] 2과목 - 2장) 4절. 윈도우 함수

by 빛나고요 2024. 3. 7.
BIG

2과목. SQL 기본 및 활용
2장. SQL 활용
4절. 윈도우 함수

# 윈도우 함수(WINDOW FUNCTION)
- 서로 다른 행의 비교나 연산을 위해 만든 함수
- GROUP BY 를 쓰지 않고 그룹 연산 가능
- LAG, LEAD, SUM, AVG, MIN, MAX, COUNT, RANK

- 문법
SELECT 윈도우함수([대상]) OVER ([PARTITON 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 절 필수

# 그룹 함수의 형태
- SUM, COUNT, AVG, MIN, MAX 등
- OVER 절을 사용하여 윈도우 함수로 사용 가능
- 반드시 연산할 대상을 그룹함수의 입력값으로 전달

- 문법
SELECT SUM(대상) OVER([PARTITION BY 컬럼]
[ORDER BY 컬럼 ASC | DESC]
[ROWS | RANGE BETWEEN A AND B]);

- 종류
① SUM OVER()
- 전체 총 합, 그룹별 총 합 출력 가능

② AVG OVER()
- SUM과 동일하게 사용

③ MIN/MAX OVER()
- SUM과 동일하게 사용

④ COUNT
- SUM과 동일하게 사용

# 윈도우 함수의 연산 범위는 집계 연산 시 행의 범위 설정 가능함
- ROWS, RANGE 차이
  · ROWS: 값이 같더라도 각 행씩 연산
  · RANGE: 같은 값의 경우 하나의 RANGE로 묶어서 연산(DEFAULT)

- BETWEEN A AND B
  · 시작점 정의
    ➢ CURRENT ROW: 현재행부터
    ➢ UNBOUNDED PRECEDING: 처음부터(DEFAULT)
    ➢ N FOLLOWING: N 이후까지

  · 마지막 시점 정의
    ➢ CURRENT ROW: 현재행까지(DEFAULT)
    ➢ UNBOUNDED FOLLOWING: 마지막
    ➢ N FOLLOWING: N 이후까지

# 순위 관련 함수
- RANK(순위)
  · RANK WITHIN GROUP
    ➢ 특정값에 대한 순위 확인
    ➢ 윈도우함수가 아닌 일반함수
  · RANK() OVER()
    ➢ 전체 중/특정 그룹 중 값의 순위 확인
    ➢ ORDER BY 절 필수
    ➢ 순위를 구할 대상을 ORDER BY 절에 명시(여러 개 나열 가능)
    ➢ 그룹 내 순위 구할 시 PARTITION BY 절 사용
  · DENSE_RANK
    ➢ 누적 순위
    ➢ 값이 같을 때 동일한 순위 부여 후 다음 순위가 바로 이어지는 순위 부여 방식
      ex) 1등이 5명이라도 그 다음 순위가 2등임(값이 같으면 동일 순위)

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


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

- 문법
SELECT LAG(컬럼,
   N)
   OVER([PARTITION BY 컬럼]
     ORDER BY 컬럼 ASC | DESC);

# FIRST_VALUE, LAST_VALUE
- 정렬 순서대로 정해진 범위에서의 처음 값, 마지막 값 출력
- 순서와 범위 정의에 따라 최솟값과 최댓값 리턴 가능

# NTILE
- 행을 특정 컬럼 순서에 따라 정해진 수의 그룹으로 나누기 위한 함수
- 그룹 번호가 리턴됨
- ORDER BY 필수
- PARTITION BY 를 사용하여 특정 그룹을 또 원하는 수만큼 그룹 분리 가능

- 문법
SELECT NTILE(N) OVER ([PARTITION BY 컬럼]
    ORDER BY 컬럼 ASC | DESC);


# 비율관련 함수
① RATIO_TO_REPORT
-  각 값의 비율 리턴(전체 비율 또는 특정 그룹 내 비율 가능)
- ORDER BY 사용 불가

- 문법
RATIO_TO_REPORT(대상) OVER([PARTITION BY …]);

② CUME_DIST: 누적비율
- 각 값의 누적 비율 리턴(전체 비율 또는 특정 그룹 내 비율 가능
- ORDER BY 필수(누적 비율을 구하는 순서를 정할 수 있음)

- 문법
CUME_DIST() OVER([PARTITION BY 컬럼]
    ORDER BY 컬럼);

③ PERCENT_RANK
- PERCENTILE(분위수) 출력
- 전체 COUNT 중 상대적 위치 출력(0~1 범위 내)
- ORDER BY 필수

- 문법
PERCENT_RANK() OVER ([PARTITION BY …]
ORDER BY …]);

댓글