SQL & 데이터베이스/SQL 성능 최적화 & 튜닝

[SQL] 윈도우 함수(Window Function) 개념과 활용 예제

Jinsapp 2025. 3. 13. 18:00

1. 윈도우 함수(Window Function)란?

윈도우 함수(Window Function)는 결과 집합의 행을 그룹화하여 각 행에 추가적인 계산을 수행하는 SQL 함수이다. 기본적인 집계 함수(SUM, AVG 등)와는 다르게, 여러 행을 참조하면서도 개별 행에 대한 결과를 반환하는 것이 특징이다.

✅ 윈도우 함수의 주요 특징

  • 일반적인 집계 함수처럼 데이터를 그룹화하지만, 개별 행도 유지됨
  • OVER() 절을 사용하여 적용
  • 순위 계산, 누적 합산, 이동 평균 등의 기능 제공

2. 주요 윈도우 함수

함수 설명 예제
ROW_NUMBER() 각 그룹 내에서 순차적인 번호를 부여 ROW_NUMBER() OVER(PARTITION BY 부서 ORDER BY 급여 DESC)
RANK() 순위를 매기며 동순위가 존재할 경우 건너뜀 RANK() OVER(PARTITION BY 부서 ORDER BY 급여 DESC)
DENSE_RANK() 동순위가 존재해도 연속적인 순위 부여 DENSE_RANK() OVER(PARTITION BY 부서 ORDER BY 급여 DESC)
LAG() 이전 행의 데이터를 참조 LAG(급여, 1, 0) OVER(PARTITION BY 부서 ORDER BY 급여 DESC)
LEAD() 다음 행의 데이터를 참조 LEAD(급여, 1, 0) OVER(PARTITION BY 부서 ORDER BY 급여 DESC)

3. 윈도우 함수 활용 예제 (Oracle 기준)

✅ 직원 테이블 생성 및 데이터 삽입

CREATE TABLE 직원 (
    사번 NUMBER PRIMARY KEY,
    이름 VARCHAR2(50),
    부서 VARCHAR2(50),
    급여 NUMBER
);

INSERT INTO 직원 VALUES (1, '김철수', '영업', 5000);
INSERT INTO 직원 VALUES (2, '이영희', '영업', 6000);
INSERT INTO 직원 VALUES (3, '박영수', '개발', 7000);
INSERT INTO 직원 VALUES (4, '최민수', '개발', 8000);
INSERT INTO 직원 VALUES (5, '한지민', '개발', 7500);

✅ 직원 급여 순위(RANK) 조회

SELECT 이름, 부서, 급여, 
       RANK() OVER(PARTITION BY 부서 ORDER BY 급여 DESC) AS 급여순위
FROM 직원;

✅ 결과 예시

이름 부서 급여 급여순위
이영희 영업 6000 1
김철수 영업 5000 2
최민수 개발 8000 1
한지민 개발 7500 2
박영수 개발 7000 3

4. 윈도우 함수의 활용 예제

✅ 직원의 급여와 이전 직원과의 차이 계산

SELECT 이름, 부서, 급여, 
       LAG(급여, 1, 0) OVER(PARTITION BY 부서 ORDER BY 급여 DESC) AS 이전급여,
       급여 - LAG(급여, 1, 0) OVER(PARTITION BY 부서 ORDER BY 급여 DESC) AS 급여차이
FROM 직원;

✅ 결과 예시

이름 부서 급여 이전급여 급여차이
이영희 영업 6000 0 6000
김철수 영업 5000 6000 -1000
최민수 개발 8000 0 8000
한지민 개발 7500 8000 -500

5. 마무리

윈도우 함수는 SQL에서 데이터를 분석하고 정렬하는 데 강력한 기능을 제공한다.

특히, 순위 매기기, 이동 평균 계산, 그룹 내 데이터 비교 등의 기능이 필요할 때 매우 유용하다.

 

 

더 많은 SQL 최적화 기법이 궁금하다면?

다른 SQL 성능 최적화 글도 함께 확인해보세요!