-
[Database] SQL Window 함수 개념과 사용 예시업무 자동화/Database 2025. 11. 11. 12:25

1. Window 함수란?
Window 함수는
“현재 행을 기준으로, 관련된 여러 행들을 하나의 ‘창(Window)’으로 묶어 놓고 그 안에서 계산하는 함수” 입니다.형식은 공통적으로
함수명(...) OVER (
[PARTITION BY 그룹기준]
[ORDER BY 정렬기준]
[ROWS/RANGE ...]
)일반 GROUP BY 집계와 달리:
- 결과를 한 줄로 줄이지 않고,
- 각 행은 그대로 두면서,
- 그 행이 속한 그룹/구간 기준의 합계·순위·이전 행 비교·비율 등을 같이 보여줄 때.
예를 들어:
- 고객별 구매 내역 + 고객별 누적 금액
- 부서별 급여 순위
- 전월 대비 증감(LAG)
- 전체 대비 매출 비율, 누적 분포
이걸 깔끔하게 해주는 게 Window 함수입니다.
아래는 실무에서 자주 쓰는 4가지 카테고리 표입니다.
Window 함수 요약표
카테고리 대표 함수 핵심 개념 대표 활용 예 순위 함수 ROW_NUMBER, RANK,
DENSE_RANK, NTILE정렬 기준에 따라 행에 순위를
부여하거나 분위 그룹을 나누는 함수상위 N명 추출, 부서별 급여 순위,
성과 등급, 4분위/10분위 그룹 분류집계 함수 SUM, AVG, COUNT, MIN,
MAX + OVER그룹/구간 기준 합계·평균·최소·최대
등을 행을 유지한 채 계산부서별 합계/평균, 일자별 누적 매출,
사용자별 누적 사용량행 순서 함수 LAG, LEAD, FIRST_VALUE,
LAST_VALUE이전/다음 행, 구간의 시작/끝 값을
참조하는 함수전일 대비 증감, 이전 상태 비교,
첫 계약가 vs 현재가, 시계열 변화 분석비율 함수 PERCENT_RANK, CUME_DIST, RATIO_TO_REPORT 등 값의 상대적 위치, 누적 분포, 전체
대비 비율 계산상위 10% 고객, 점수 분포 분석, 카테
고리별 매출 비중, 누적 퍼센트 커트라인2. 순위 함수 (Ranking Functions)
2-1. ROW_NUMBER()
동률과 관계없이 1,2,3… 연속 번호 부여
SELECT *
FROM (
SELECT
dept,
emp_name,
salary,
ROW_NUMBER() OVER (
PARTITION BY dept
ORDER BY salary DESC
) AS rn
FROM employee
) t
WHERE rn <= 3;부서별 상위 3명 뽑기 등 TOP N 필터에 적합합니다.
2-2. RANK(), DENSE_RANK()- RANK() : 동률 시 등수 건너뜀 (1,1,3,…)
- DENSE_RANK() : 동률 시 등수 밀착 (1,1,2,3…)
SELECT
emp_name,
salary,
RANK() OVER (ORDER BY salary DESC) AS rnk,
DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
FROM employee;
2-3. NTILE(n)정렬 기준으로 행을 n개의 구간으로 나눠 분위 계산
SELECT
emp_name,
salary,
NTILE(4) OVER (ORDER BY salary DESC) AS quartile
FROM employee;상·중·하, 4분위/10분위 등급 나눌 때 사용합니다.3. 집계 Window 함수 (SUM/AVG/COUNT… OVER)
3-1. SUM() OVER, AVG() OVER, COUNT() OVER
부서별 합계/평균, 그룹 집계를 각 행에 함께 표시하는 패턴SELECT
dept,
emp_name,
salary,
SUM(salary) OVER (PARTITION BY dept) AS dept_total,
AVG(salary) OVER (PARTITION BY dept) AS dept_avg,
COUNT(*) OVER (PARTITION BY dept) AS dept_cnt
FROM employee;부서별 합계/평균을 각 직원 행에 붙여 비교 가능합니다.
3-2. SUM() OVER (ORDER BY ...) - 누적 합계(Running Total)SELECT
sales_date,
amount,
SUM(amount) OVER (
ORDER BY sales_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS cum_amount
FROM daily_sales;4. 행 순서 함수 (Row Navigation)
4-1. LAG()
이전 행 값 참조 → 전일/전월 대비 분석에 특화
SELECT
sales_date,
amount,
LAG(amount) OVER (ORDER BY sales_date) AS prev_amount,
amount - LAG(amount) OVER (ORDER BY sales_date) AS diff_from_prev
FROM daily_sales;
4-2. LEAD()다음 행 값 참조
SELECT
step_no,
status,
LEAD(status) OVER (ORDER BY step_no) AS next_status
FROM process_log;
4-3. FIRST_VALUE, LAST_VALUE윈도우 내 기준값(시작/끝)을 고정해서 비교
SELECT
emp_id,
change_date,
salary,
FIRST_VALUE(salary) OVER (
PARTITION BY emp_id
ORDER BY change_date
) AS first_salary
FROM salary_history;첫 연봉 대비 인상률 등 분석에 사용합니다.5. 비율 / 분포 함수 (Ratio & Distribution)
5-1. RATIO_TO_REPORT() / SUM() OVER()를 이용한 전체 대비 비율
SELECT
category,
amount,
amount / SUM(amount) OVER () AS ratio_of_total
FROM sales_by_category;
5-2. PERCENT_RANK(), CUME_DIST() – 백분위 & 누적 분포SELECT
emp_name,
salary,
PERCENT_RANK() OVER (ORDER BY salary) AS pr,
CUME_DIST() OVER (ORDER BY salary) AS cd
FROM employee;- PERCENT_RANK : 상대적 순위(0~1)
- CUME_DIST : 해당 값 이하 누적 비율
상위 10% 인원, 하위 20% 컷, 점수 분포 분석 등에 활용합니다.
'업무 자동화 > Database' 카테고리의 다른 글
[Database] SQL 카테시안 곱: 원인, 증상, 재현 예시, 예방 체크리스트 (0) 2025.11.13 [Database] SQL의 정규표현식: 정의, 핵심 패턴 표, DBMS별 사용법, 이메일·전화번호·주소 예시 (0) 2025.11.12 [Database] 반정규화(Denormalization)의 개념과 적용 (0) 2025.11.10 [Database] 정규화(1NF~BCNF) 개념과 예시 (0) 2025.11.08 [Database] 데이터 모델링의 특징 및 유의사항 (0) 2025.11.07