2 분 소요


MySQL 윈도우 함수에서 PRECEDING, FOLLOWING, CURRENT ROW 옵션 정리
윈도우 함수에서 **PRECEDING
, FOLLOWING, CURRENT ROW와 같은 옵션들은 윈도우 프레임을 정의할 때 사용됩니다.
윈도우 프레임은 각 행에 대해 계산할 범위(창)를 지정하며, 이 범위 내에서 집계나 순위 계산이 이루어집니다.

윈도우 프레임의 주요 옵션

  1. PRECEDING: 현재 행을 기준으로 앞쪽의 행들을 지정합니다.
    • N PRECEDING: 현재 행에서 앞으로 N개의 행
  2. FOLLOWING: 현재 행을 기준으로 뒤쪽의 행들을 지정합니다.
    • N FOLLOWING: 현재 행에서 뒤로 N개의 행
  3. CURRENT ROW: 현재 행만 포함하는 것을 의미합니다.
  4. UNBOUNDED PRECEDING: 윈도우 프레임의 시작을 테이블의 첫 번째 행으로 지정합니다.
  5. UNBOUNDED FOLLOWING: 윈도우 프레임의 끝을 테이블의 마지막 행으로 지정합니다.


윈도우 함수 기본 구문

<윈도우 함수> OVER (PARTITION BY column ORDER BY column ROWS | RANGE BETWEEN <프레임 정의>)
  • ROWS: 실제 행의 개수를 기준으로 프레임을 설정합니다.
  • RANGE: 값의 범위를 기준으로 프레임을 설정합니다 (예: 날짜 또는 숫자 범위).


ROWS vs RANGE

  • ROWS: 실제로 행 개수를 기준으로 윈도우 프레임을 설정합니다.
    • 예: ROWS BETWEEN 2 PRECEDING AND CURRENT ROW현재 행과 그 앞 2개의 행을 포함합니다.
  • RANGE: 값의 범위를 기준으로 윈도우 프레임을 설정합니다.
    • 예: RANGE BETWEEN INTERVAL 1 DAY PRECEDING AND CURRENT ROW날짜 값을 기준으로 프레임을 설정합니다.


프레임 지정 옵션 설명

1. UNBOUNDED PRECEDING

  • 처음부터 현재 행까지의 모든 행을 포함합니다.
  • “시작이 없을 만큼” 이전의 모든 행을 포함하는 의미입니다.
# 설명:  번째 행부터 현재 행까지 누적 합계를 계산합니다.
SUM(amount) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)


2. CURRENT ROW

  • 현재 행만을 포함합니다.
  • 윈도우 프레임이 현재 행에서 시작하거나 끝날 때 사용됩니다.
# 설명: 현재 행과  뒤에 있는 2개의 행에 대해 평균 급여를 계산합니다.
AVG(salary) OVER (ORDER BY hire_date ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING)


3. N PRECEDING

  • 현재 행을 기준으로 앞으로 N개의 행을 포함합니다.
# 설명: 현재 행에서 앞으로 3개의 행과 현재 행을 포함한 누적 합계를 계산합니다.
SUM(sales) OVER (ORDER BY sales_date ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)


4. N FOLLOWING

  • 현재 행을 기준으로 뒤로 N개의 행을 포함합니다.
# 설명: 현재 행과  뒤의 2개의 행에 대해 누적 합계를 계산합니다.
SUM(sales) OVER (ORDER BY sales_date ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING)


5. UNBOUNDED FOLLOWING

  • 현재 행부터 끝까지 모든 행을 포함합니다.
# 설명: 현재 행부터 마지막 행까지의 합계를 계산합니다.
SUM(sales) OVER (ORDER BY sales_date ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)


예시

1. 누적 합계 (처음부터 현재까지)

# 설명:  번째 행부터 현재 행까지의 누적 합계를 계산합니다.
SELECT 
    sales_date, 
    sales_amount,
    SUM(sales_amount) OVER (ORDER BY sales_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_sales
FROM Sales;


2. 현재 행과 이전 2개의 행의 합계

# 설명: 현재 행과  앞의 2 행의 합계를 계산합니다.  3개의 행에 대해 집계가 이루어집니다.
SELECT 
    sales_date, 
    sales_amount,
    SUM(sales_amount) OVER (ORDER BY sales_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS window_sales
FROM Sales;


3. 현재 행과 다음 2개의 행에 대한 평균

# 설명: 현재 행과  뒤의 2 행에 대한 평균을 계산합니다.
SELECT 
    sales_date, 
    sales_amount,
    AVG(sales_amount) OVER (ORDER BY sales_date ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) AS avg_sales
FROM Sales;


4. 현재 행과 모든 이후 행에 대한 최대값

# 설명: 현재 행부터 마지막 행까지의 `sales_amount`   최대값을 반환합니다.
SELECT 
    sales_date, 
    sales_amount,
    MAX(sales_amount) OVER (ORDER BY sales_date ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS max_future_sales
FROM Sales;


댓글남기기