hanker

SQL - Window Functions 의 모든 것 (윈도우 함수) 본문

DATABASE/SQL

SQL - Window Functions 의 모든 것 (윈도우 함수)

hanker 2025. 1. 4. 00:00
반응형

SQL 윈도우 함수(Window Functions)는 데이터를 그룹화하지 않고도 집계 값을 계산하거나 순위를 매길 때 사용된다.

윈도우 함수는 데이터 분석에 강력한 도구를 제공하며, 데이터를 더 세밀하게 처리할 수 있도록 도와준다.

이번 글에서는 윈도우 함수의 정의와 활용 방법을 알아보자!


1. 윈도우 함수란?

 

윈도우 함수는 쿼리 결과 데이터에서 각 행에 대해 계산을 수행하며, OVER 절과 함께 사용된다.

 

- 기존의 집계 함수(SUM, AVG 등)와 달리, 그룹화를 하지 않고도 계산할 수 있다.

- 각 행에 대해 범위를 정의하여 계산을 수행한다.

 


2. 윈도우 함수의 기본 구조

 

아래 기본 문법으로 사용 방법에 대해서 알아보자.

<윈도우 함수>(컬럼명) OVER ([PARTITION BY 컬럼명] [ORDER BY 컬럼명])

PARTITION BY: 데이터를 특정 기준으로 나눈다.

ORDER BY: 윈도우 내에서 행의 순서를 지정한다.

 

 


3. 주요 윈도우 함수 종류

 

3.1 집계 함수와 함께 사용

윈도우 함수는 SUM, AVG, MIN, MAX, COUNT와 함께 사용할 수 있다.

 

아래 누적 합계를 계산하는 쿼리를 보자

SELECT 
    employee_id, 
    department_id, 
    salary, 
    SUM(salary) OVER (PARTITION BY department_id ORDER BY employee_id) AS cumulative_salary 
FROM employees;

# 결과: 부서별로 직원의 급여 누적 합계를 계산한다.
 

 

 

 

3.2 순위 함수

 

- RANK(): 순위를 매기며, 동일한 순위가 있을 경우 건너뛴다.

- DENSE_RANK(): 순위를 매기며, 동일한 순위가 있을 경우 건너뛰지 않는다.

- ROW_NUMBER(): 순서를 매기며 중복이 없다.

 

아래 순위 계산하는 쿼리로 알아보자

SELECT 
    employee_id, 
    department_id, 
    salary, 
    RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank, 
    DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS dense_rank, 
    ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS row_number 
FROM employees;
# 결과: 부서별로 급여 순위를 계산한다.

 

 

3.3 LEAD와 LAG

 

- LEAD(): 다음 행의 값을 가져온다.

- LAG(): 이전 행의 값을 가져온다.

 

아래 이전달 및 다음달 급여 비교 쿼리로 알아보자.

SELECT 
    employee_id, 
    department_id, 
    salary, 
    LAG(salary) OVER (PARTITION BY department_id ORDER BY salary) AS previous_salary, 
    LEAD(salary) OVER (PARTITION BY department_id ORDER BY salary) AS next_salary 
FROM employees;
# 결과: 각 직원의 이전 급여와 다음 급여를 비교한다.

 

 

 

3.4 FIRST_VALUE와 LAST_VALUE

 

- FIRST_VALUE(): 윈도우 내 첫 번째 값을 반환한다.

- LAST_VALUE(): 윈도우 내 마지막 값을 반환한다.

 

아래 첫 번째 및 마지막 급여 쿼리

 

SELECT 
    employee_id, 
    department_id, 
    salary, 
    FIRST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY salary) AS first_salary, 
    LAST_VALUE(salary) 
    OVER (PARTITION BY department_id ORDER BY salary 
        ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_salary 
FROM employees;
# 결과: 부서별로 첫 번째와 마지막 급여를 반환한다.

 

 


 

4. 프레임 정의 (ROWS와 RANGE)

 

윈도우 함수는 ROWS 또는 RANGE를 사용해 데이터 범위를 세밀하게 지정할 수 있다.

 

ROWS 예제

SELECT 
    employee_id, 
    salary, 
    SUM(salary) OVER (ORDER BY employee_id ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS rolling_sum 
FROM employees;
# 결과: 현재 행과 이전 두 행의 급여 합계를 계산한다.

 

RANGE 예제
SELECT 
    employee_id, 
    salary, 
    SUM(salary) OVER (ORDER BY salary RANGE BETWEEN 1000 PRECEDING AND CURRENT ROW) AS range_sum 
FROM employees;
# 결과: 현재 행과 급여 차이가 1000 이하인 모든 행의 급여 합계를 계산한다.

 

 


5. 윈도우 함수 활용 사례

 

5.1 매출 누적 합계

SELECT 
    sale_date, 
    product_id, 
    amount, 
    SUM(amount) OVER (PARTITION BY product_id ORDER BY sale_date) AS cumulative_sales 
FROM sales;
# 결과: 제품별로 날짜 순 매출 누적 합계를 계산한다.

 

 

5.2 이동 평균 (Rolling Average)

SELECT 
    employee_id, 
    salary, 
    AVG(salary) OVER (ORDER BY employee_id ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS rolling_avg 
FROM employees;
# 결과: 이전 두 행과 현재 행의 급여 평균을 계산한다.

 

 

 


6. 윈도우 함수와 GROUP BY의 차이
특징 윈도우 함수 GROUP BY
결과 행 원래 행 유지 그룹당 하나의 결과 행 반환
사용 목적 행 단위로 집계 값 계산 그룹 전체 집계 값 계산
데이터 처리 범위 PARTITION BY를 사용해 세밀한 제어 가능 그룹화된 데이터만 처리 가능

 

 

SQL 윈도우 함수는 데이터를 더욱 정교하게 처리하고, 분석 업무를 효율적으로 수행하는 데 필수적이다.

충분한 반복 학습으로 습득하거나, 이렇게 예제 코드를 한번 보고 나중에 검색해서 사용하면 된다.

반응형