ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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% 컷, 점수 분포 분석 등에 활용합니다.

     

Designed by Tistory.