윈도우 함수란?
윈도우 함수(Window Function) 는GROUP BY 없이도 각 행에 대해 관련된 행들의 집합(윈도우) 을 기준으로 계산을 수행하는 함수입니다. 일반 집계 함수와 달리 행의 개수를 줄이지 않고, 각 행에 분석 결과를 추가합니다.
💡 비유: 윈도우 함수는 “나의 성적이 반 전체에서 몇 등인지” 알려주는 것과 같습니다. 반 전체 성적표가 유지되면서, 각 학생 옆에 순위가 추가됩니다.
OVER 절 기본 구문
| 요소 | 설명 | 필수 여부 |
|---|---|---|
PARTITION BY | 데이터를 논리적 그룹으로 나눕니다 | 선택 (생략 시 전체가 하나의 파티션) |
ORDER BY | 파티션 내에서 행의 순서를 결정합니다 | 함수에 따라 다름 |
프레임 지정 | 현재 행 기준으로 계산 범위를 지정합니다 | 선택 |
순위 함수
ROW_NUMBER, RANK, DENSE_RANK, NTILE
순위 함수 비교
| 함수 | 동일 값 처리 | 예시 (값: 100, 90, 90, 80) |
|---|---|---|
ROW_NUMBER() | 항상 고유 순번 | 1, 2, 3, 4 |
RANK() | 같은 순위, 다음 순위 건너뜀 | 1, 2, 2, 4 |
DENSE_RANK() | 같은 순위, 다음 순위 연속 | 1, 2, 2, 3 |
NTILE(N) | N개 그룹으로 균등 분배 | NTILE(2) → 1, 1, 2, 2 |
실전 예제: 부서별 급여 순위
집계 윈도우 함수
SUM, AVG, COUNT, MIN, MAX를 윈도우 함수로 사용하면 행을 줄이지 않고 집계 결과를 추가합니다.
누적 합계와 이동 평균
오프셋 함수: LAG, LEAD, FIRST_VALUE, LAST_VALUE
LAG / LEAD (전후 행 참조)
| 함수 | 설명 | 인자 |
|---|---|---|
LAG(col, n, default) | n행 이전의 값을 반환합니다 | n: 오프셋(기본 1), default: 기본값 |
LEAD(col, n, default) | n행 이후의 값을 반환합니다 | n: 오프셋(기본 1), default: 기본값 |
FIRST_VALUE / LAST_VALUE
⚠️ LAST_VALUE 주의사항: 프레임을 명시하지 않으면 기본 프레임(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)이 적용되어, 현재 행까지만 보입니다. 전체 파티션의 마지막 값을 얻으려면ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING을 명시해야 합니다.
프레임 지정: ROWS BETWEEN, RANGE BETWEEN
프레임 구문
| 프레임 경계 | 의미 |
|---|---|
UNBOUNDED PRECEDING | 파티션의 첫 행입니다 |
N PRECEDING | 현재 행의 N행 이전입니다 |
CURRENT ROW | 현재 행입니다 |
N FOLLOWING | 현재 행의 N행 이후입니다 |
UNBOUNDED FOLLOWING | 파티션의 마지막 행입니다 |
ROWS vs RANGE
| 구분 | ROWS | RANGE |
|---|---|---|
| 기준 | 물리적 행 수 | 논리적 값 범위 |
| 동일 값 처리 | 각 행을 개별로 취급합니다 | 같은 값의 행을 하나로 취급합니다 |
| 사용 빈도 | 더 자주 사용됩니다 | 날짜/시간 범위에 유용합니다 |
QUALIFY 절
QUALIFY는 윈도우 함수의 결과를 서브쿼리 없이 직접 필터링 하는 Databricks SQL 전용 절입니다.QUALIFY 활용 패턴
실전 예제
매출 순위와 점유율 분석
고객 이탈 분석 (마지막 구매 이후 경과일)
정리
| 함수 카테고리 | 함수 | 핵심 포인트 |
|---|---|---|
| 순위 | ROW_NUMBER, RANK, DENSE_RANK, NTILE | 파티션 내 행에 순위를 부여합니다 |
| 집계 | SUM, AVG, COUNT OVER | 행을 줄이지 않고 집계를 추가합니다 |
| 오프셋 | LAG, LEAD, FIRST_VALUE, LAST_VALUE | 전후 행이나 첫/끝 값을 참조합니다 |
| 프레임 | ROWS BETWEEN, RANGE BETWEEN | 계산 범위를 세밀하게 제어합니다 |
| QUALIFY | QUALIFY 절 | 윈도우 함수 결과를 서브쿼리 없이 필터링합니다 |