윈도우 함수는 행과 행 간의 관계를 정의하여 결과 세트를 계산하는 함수입니다.
💡 GROUP BY와의 결정적 차이점
GROUP BY: 지정한 칼럼을 기준으로 행을 그룹화하여 결과 행의 수가 줄어듭니다.
윈도우 함수: 기존 행의 페이징이나 구조를 유지하면서, 각 행에 계산된 값을 추가합니다. 즉, 기존 행의 수가 그대로 유지됩니다.
윈도우 함수는 OVER 절을 필수로 동반합니다.
SELECT WINDOW_FUNCTION(arguments) OVER (
[PARTITION BY 컬럼]
[ORDER BY 컬럼]
[WINDOWING 절]
) FROM 테이블명;
| 분류 | 함수명 | 설명 | 주요 실무 활용 예시 |
|---|---|---|---|
| 순위 (Ranking) | ROW_NUMBER() | 동점자가 있어도 무조건 1, 2, 3, 4 등 고유한 순위를 부여 | 게시판 페이징 처리, 최신 데이터 1건만 추출할 때 |
RANK() | 동점자에게 공동 순위를 부여하고, 다음 순위는 건너뜀 (예: 1, 2, 2, 4) | 시험 석차 구하기, 매출 상위 TOP N 경쟁사 분석 | |
DENSE_RANK() | 동점자에게 공동 순위를 부여하지만, 다음 순위를 연속해서 부여 (예: 1, 2, 2, 3) | 등수 건너뜀 없이 등급을 매길 때 | |
NTILE(N) | 전체 행을 지정한 개수 N개의 그룹으로 균등하게 분할 | 고객 데이터 기반 상위 25%(4분위) 타겟팅 군집 분할 | |
| 집계 (Aggregation) | SUM() | 파티션별 또는 지정된 윈도우 범위 내의 누적 합계 계산 | 일별 누적 매출액 계산, 월별 지출 합계 추이 |
AVG() | 파티션별 또는 지정된 윈도우 범위 내의 평균값 계산 | 최근 3개월간의 이동 평균 매출, 부서별 평균 급여 비교 | |
COUNT() | 파티션별 또는 지정된 윈도우 범위 내의 행 개수 계산 | 특정 기간 동안 고객별 누적 구매 횟수 카운트 | |
MAX() / MIN() | 파티션별 또는 지정된 윈도우 범위 내의 최대값 / 최소값 추출 | 현재 직원 급여와 부서 내 최고/최저 급여를 동시에 비교 | |
| 행 순서 (Value) | LAG(컬럼, N) | 현재 행을 기준으로 N번째 이전 행의 값을 가져옴 | 전월 대비 매출 성장률 계산, 이전 상담 기록 매칭 |
LEAD(컬럼, N) | 현재 행을 기준으로 N번째 이후 행의 값을 가져옴 | 현재 이벤트 종료일과 다음 이벤트 시작일 간격 계산 | |
FIRST_VALUE() | 파티션별 또는 지정된 윈도우 범위 내의 가장 첫 번째 행의 값을 가져옴 | 우리 부서에서 가장 먼저 입사한 사람의 입사일 조회 | |
LAST_VALUE() | 파티션별 또는 지정된 윈도우 범위 내의 가장 마지막 행의 값을 가져옴 | 현재까지 마감된 자산의 최종 잔액 확인 | |
| 비율 (Ratio) | CUME_DIST() | 파티션 내에서 현재 값보다 작거나 같은 값의 누적 백분율(0~1) 계산 | 내 성적이 상위 몇 %에 위치하는지 상대적 위치 파악 |
PERCENT_RANK() | 파티션 내에서 현재 행의 상대적 순위 백분율(0~1) 계산 | 데이터 분포도 분석 및 백분위수 시각화 데이터 준비 |
S