1. 윈도우 함수란 무엇인가?
윈도우 함수 (Window Function)는 행과 행 사이의 관계를 분석하기 위한 SQL 함수이다.
일반 집계 함수 (GROUP BY)와 가장 큰 차이는 다음이다.
| 구분 | GROUP BY | 윈도우 함수 |
| 결과 행 | 줄어든다 | 유지된다 |
| 계산 대상 | 그룹 단위 | 각 행 기준 |
| 특징 | 집계 후 행 축소 | 기존 행 유지 + 추가 계산 |
윈도우 함수는 "행을 그대로 두고 그 위에 분석값을 덧붙이는 함수"이다.
2. 윈도우 함수의 기본 구조 (핵심 문법)
윈도우 함수는 반드시 OVER() 키워드와 함께 사용된다.
윈도우함수() OVER (옵션)
대표 옵션 3가지:
- ORDER BY → 순위 / 누적 계산
- PARTITION BY → 그룹 나눔
- (WINDOW FRAME) → 범위 지정
예시:
SELECT
NAME,
RANK() OVER(ORDER BY SALARY DESC) AS RANK
FROM EMP;
3. 순위 함수 (RANK 계열)
순위를 매길 때 사용하는 함수이다. 시험 + 실무 둘 다 매우 중요하다.
1) RANK()
특징:
- 동일 값이면 같은 순위
- 다음 순위가 건너뛴다 (1, 2, 2, 4)
SELECT MPG,
COUNT(*),
RANK() OVER(ORDER BY COUNT(*) DESC) AS RANK
FROM MTCARS
GROUP BY MPG;
순위 = 앞에 있는 값 개수 + 1
2) DENSE_RANK()
특징:
- 동일 값 같은 순위
- 순위가 끊기지 않음 (1, 2, 2, 3)
SELECT MPG,
COUNT(*),
DENSE_RANK() OVER(ORDER BY COUNT(*) DESC) AS RANK
FROM MTCARS
GROUP BY MPG;
핵심 차이 (면접 단골):
| 함수 | 결과 |
| RANK | 1, 2, 2, 4 |
| DENSE_RANK | 1, 2, 2, 3 |
3) ROW_NUMBER()
특징:
- 무조건 고유 순번 부여
- 중복 허용 없음
SELECT MPG,
COUNT(*),
ROW_NUMBER() OVER(ORDER BY COUNT(*) DESC) AS RN
FROM MTCARS
GROUP BY MPG;
| 함수 | 용도 |
| ROW_NUMBER | 페이징, TOP-N |
| RANK | 공동 순위 |
| DENSE_RANK | 연속 순위 |
4. 집계 함수 + 윈도우 (OVER)
일반 집계 함수도 OVER와 함께 사용 가능하다.
사용 가능 함수: COUNT(), SUM(), AVG(), MIN(), MAX()
SELECT NAME,
COUNT(*) OVER(PARTITION BY CYL) AS PART_CYL_CNT
FROM MTCARS;
실린더(CYL) 그룹별 행 개수를 각 행마다 표시한다.
PARTITION BY (진짜 핵심 개념)
PARTITION BY는 데이터를 그룹으로 나눈 후 윈도우 계산을 수행한다.
SELECT NAME,
MAX(MPG) OVER(PARTITION BY CYL) AS PART_MAX_MPG
FROM MTCARS;
설명:
- CYL 기준으로 그룹 나눔
- 각 그룹 내 최대 MPG를 모든 행에 표시
5. 행 순서 함수 (LAG / LEAD / FIRST_VALUE)
1) FIRST_VALUE()
파티션 내 첫 번째 값을 가져온다.
SELECT NAME,
FIRST_VALUE(MPG) OVER(PARTITION BY CYL ORDER BY MPG) AS FIRST_MPG
FROM MTCARS;
2) LAST_VALUE()
파티션 내 마지막 값을 반환한다.
3) LAG() — 이전 행 값 가져오기 (매우 중요)
SELECT NAME,
MPG,
LAG(MPG) OVER(ORDER BY MPG) AS PREV_MPG
FROM MTCARS;
실무 활용:
- 이전 데이터 비교
- 전일 대비 변화율 분석
- 로그 분석
4) LEAD() — 다음 행 값 가져오기
SELECT NAME,
LEAD(MPG) OVER(ORDER BY MPG) AS NEXT_MPG
FROM MTCARS;
6. 비율 함수 (분석용 핵심)
1) CUME_DIST() — 누적 분포 비율
SELECT NAME,
CUME_DIST() OVER(ORDER BY MPG) AS C_DIST
FROM MTCARS;
2) PERCENT_RANK() — 백분위 순위 (0 ~ 1)
SELECT NAME,
PERCENT_RANK() OVER(ORDER BY MPG) AS P_RANK
FROM MTCARS;
3) NTILE(N) — 데이터를 N개 구간으로 나누기
SELECT NAME,
NTILE(5) OVER(ORDER BY MPG) AS GRADE
FROM MTCARS;
실무 예:
- 고객 등급 나누기
- 상위 20% 분석
- 성과 등급 분류
7. 윈도우 함수 vs GROUP BY (시험 핵심 비교)
| 항목 | GROUP BY | 윈도우 함수 |
| 행 개수 | 줄어든다 | 그대로 유지 |
| 분석 방식 | 집계 중심 | 행 기반 분석 |
| 실무 활용 | 통계 요약 | 순위, 비교, 누적 |
| 난이도 | 중 | 중상 (SQL 고급) |
8. 실무에서 진짜 많이 쓰는 윈도우 함수 TOP 5
개발 + 데이터 분석 기준
- ROW_NUMBER() → 페이징
- RANK() → 순위 시스템
- LAG() → 이전 데이터 비교
- PARTITION BY + COUNT() → 그룹 통계
- NTILE() → 등급 분류
9. 실무 관점 핵심 정리
- 윈도우 함수는 데이터 분석 SQL의 핵심
- BI, 로그 분석, 랭킹 시스템에서 필수
- GROUP BY로 해결 불가능한 문제를 해결함
- OVER() 없으면 윈도우 함수 사용 불가
- PARTITION BY + ORDER BY 조합이 핵심 패턴
윈도우 함수는 행을 유지한 상태에서 순위, 누적, 비교, 비율 등의 분석 값을 계산하는 SQL 고급 함수이며 OVER 절과 함께 사용하고 PARTITION BY와 ORDER BY로 분석 범위를 제어한다.
'SQLD 시험 대비' 카테고리의 다른 글
| SQLD 계층형 질의와 셀프 조인 (0) | 2026.03.02 |
|---|---|
| SQLD Top N 쿼리 (0) | 2026.03.01 |
| SQLD 고급 그룹함수 (0) | 2026.02.27 |
| SQLD 집합연산자 (0) | 2026.02.27 |
| SQLD 서브쿼리 (0) | 2026.02.26 |