본문 바로가기
데이터베이스 DB

SQL 윈도우 함수 정리: 개념과 예제

by tovantablack 2024. 12. 17.
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

댓글