MySQL 문법 및 예제 정리 - PRECEDING, FOLLOWING, CURRENT ROW
MySQL 윈도우 함수에서 PRECEDING
, FOLLOWING
, CURRENT ROW
옵션 정리
윈도우 함수에서 **PRECEDING
, FOLLOWING
, CURRENT ROW
와 같은 옵션들은 윈도우 프레임을 정의할 때 사용됩니다.
윈도우 프레임은 각 행에 대해 계산할 범위(창)를 지정하며, 이 범위 내에서 집계나 순위 계산이 이루어집니다.
윈도우 프레임의 주요 옵션
PRECEDING
: 현재 행을 기준으로 앞쪽의 행들을 지정합니다.N PRECEDING
: 현재 행에서 앞으로 N개의 행
FOLLOWING
: 현재 행을 기준으로 뒤쪽의 행들을 지정합니다.N FOLLOWING
: 현재 행에서 뒤로 N개의 행
CURRENT ROW
: 현재 행만 포함하는 것을 의미합니다.UNBOUNDED PRECEDING
: 윈도우 프레임의 시작을 테이블의 첫 번째 행으로 지정합니다.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;
댓글남기기