728x90
728x90
**윈도우 함수(Window Function)**는 SQL에서 특정 행 집합(윈도우 또는 프레임)에 대해 계산을 수행하는 함수입니다. 집계 함수와 비슷하지만, 행별로 결과를 반환한다는 점에서 차이가 있습니다. 주로 순위 계산, 누적 합계, 이전/다음 값 참조 등에 사용됩니다.
1. 윈도우 함수 기본 문법
SELECT 컬럼명,
WINDOW_FUNCTION() OVER (
[PARTITION BY 컬럼]
[ORDER BY 컬럼]
[ROWS | RANGE BETWEEN ...]
) AS 별칭
FROM 테이블명;
- WINDOW_FUNCTION(): 사용할 윈도우 함수 (SUM, RANK, LAG 등)
- PARTITION BY: 데이터를 그룹화합니다.
- ORDER BY: 정렬 기준을 지정합니다.
- ROWS | RANGE: 윈도우 프레임을 설정합니다.
2. 주요 윈도우 함수
1) 순위 함수 (Ranking Functions)
- RANK(): 동점일 경우 같은 순위를 부여하고, 다음 순위는 건너뜀
- DENSE_RANK(): 동점일 경우 같은 순위를 부여하지만 건너뛰지 않음
- ROW_NUMBER(): 행에 순차적인 번호를 부여
예시: 급여 순위 매기기
SELECT emp_id, 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;
2) 집계 함수 (Aggregate Functions)
SUM, AVG, MAX, MIN, COUNT 등을 사용해 그룹이나 누적 값을 계산합니다.
예시: 부서별 급여 누적 합계
SELECT department_id, emp_id, salary,
SUM(salary) OVER (PARTITION BY department_id ORDER BY emp_id) AS running_total
FROM employees;
3) 값 참조 함수 (LAG, LEAD)
- LAG(): 이전 행의 값을 가져옴
- LEAD(): 다음 행의 값을 가져옴
예시: 이전 급여와의 차이 계산
SELECT emp_id, salary,
LAG(salary) OVER (ORDER BY emp_id) AS prev_salary,
salary - LAG(salary) OVER (ORDER BY emp_id) AS salary_diff
FROM employees;
4) 첫 번째/마지막 값 함수
- FIRST_VALUE(): 파티션에서 첫 번째 값 반환
- LAST_VALUE(): 파티션에서 마지막 값 반환
예시: 부서별 첫 번째 급여 가져오기
SELECT department_id, emp_id, salary,
FIRST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY emp_id) AS first_salary
FROM employees;
3. 윈도우 프레임 설정
윈도우 프레임을 사용하면 특정 범위의 행에 대해 계산을 수행할 수 있습니다.
예시: 누적 합계 계산
SELECT emp_id, salary,
SUM(salary) OVER (
ORDER BY emp_id
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS cumulative_sum
FROM employees;
- UNBOUNDED PRECEDING: 첫 번째 행부터 시작
- CURRENT ROW: 현재 행까지 포함
4. 윈도우 함수 vs GROUP BY
구분 윈도우 함수 GROUP BY
결과 행 | 각 행에 추가된 계산 결과 반환 | 하나의 그룹당 하나의 결과만 반환 |
용도 | 행별 계산, 누적 합계, 순위 계산 | 그룹별 통계 계산 |
예시: GROUP BY와 윈도우 함수 비교
-- GROUP BY 사용
SELECT department_id, SUM(salary)
FROM employees
GROUP BY department_id;
-- 윈도우 함수 사용
SELECT department_id, emp_id, salary,
SUM(salary) OVER (PARTITION BY department_id) AS total_salary
FROM employees;
5. 결론: 윈도우 함수 요약
함수 설명
RANK() | 순위 부여 (동점 시 순위 건너뜀) |
DENSE_RANK() | 순위 부여 (동점 시 순위 건너뛰지 않음) |
ROW_NUMBER() | 순차적으로 번호 부여 |
SUM, AVG, COUNT | 누적 합계, 평균, 개수 계산 |
LAG(), LEAD() | 이전 행/다음 행 값 참조 |
FIRST_VALUE() | 파티션 내 첫 번째 값 반환 |
LAST_VALUE() | 파티션 내 마지막 값 반환 |
728x90
728x90
'데이터베이스 DB' 카테고리의 다른 글
오라클 힌트 사용법 (0) | 2024.12.17 |
---|---|
서브쿼리 종류 (0) | 2024.12.17 |
VIEW PUSHED PREDICATE (0) | 2024.12.17 |
오라클 환경셋팅, 오라클 다운로드 방법 (0) | 2024.12.17 |
SQL 실행 계획 분석 실전 (0) | 2024.12.17 |
댓글