윈도우 함수
윈도우 함수(Window Function)는 GROUP BY처럼 집계하지만, 행을 합치지 않고 각 행을 유지한 채 집계 결과를 함께 보여줍니다. SQLD/SQLP 필수 개념입니다. 그룹 집계 + 개별 행 유지
기본 문법
함수() OVER (
[PARTITION BY 그룹컬럼]
[ORDER BY 정렬컬럼]
[ROWS/RANGE 범위]
)예제
급여 순위 (RANK / DENSE_RANK / ROW_NUMBER)
RANK는 동점 다음 번호를 건너뛰고, DENSE_RANK는 이어서 매기며, ROW_NUMBER는 무조건 고유 번호를 부여합니다.
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) AS RANK순위,
DENSE_RANK() OVER (ORDER BY salary DESC) AS DENSE_RANK순위,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS ROW_NUMBER순위
FROM employees;부서 내 급여 순위 (PARTITION BY)
PARTITION BY로 그룹을 나눠 각 그룹 내에서 순위를 매깁니다.
SELECT name, department_id, salary,
RANK() OVER (
PARTITION BY department_id
ORDER BY salary DESC
) AS 부서내순위
FROM employees
ORDER BY department_id, 부서내순위;LAG / LEAD — 이전·다음 행 참조
LAG는 이전 행, LEAD는 다음 행의 값을 가져옵니다. 전월 대비 비교 등에 활용합니다.
SELECT name, salary,
LAG(salary) OVER (ORDER BY salary) AS 이전급여,
LEAD(salary) OVER (ORDER BY salary) AS 다음급여,
salary - LAG(salary) OVER (ORDER BY salary) AS 차이
FROM employees
ORDER BY salary;누적 합계 (SUM OVER)
ROWS BETWEEN으로 집계 범위를 지정합니다. UNBOUNDED PRECEDING = 처음부터 현재 행까지.
SELECT name, salary,
SUM(salary) OVER (
ORDER BY salary
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS 누적급여합
FROM employees
ORDER BY salary;알아두면 좋은 것
- PARTITION BY는 GROUP BY처럼 그룹을 나누지만, 행을 합치지 않습니다.
- RANK vs DENSE_RANK: 동점자 처리 방식이 시험에 자주 출제됩니다.
- LAG(컬럼, N, 기본값): N번째 이전 행 참조, 없으면 기본값 반환.