ROWS는 물리적 행의 순서를 기준으로 윈도우를 정의 한다. RANGE는 정렬 기준 값이 같은 행들을 하나의 그룹으로 취금해서 계산한다. 쉽게 말하면 한 줄 씩 차례대로 계산하고 RANGE는 같은 값 끼리 묶어서 계산한다.
예시
다음과 같은 테이블이 있다고 생각해보자.
-- 학생 성적 테이블
student_name | exam_date | score
김철수 | 2024-03-01 | 85
이영희 | 2024-03-01 | 85
박민수 | 2024-03-02 | 90
최지영 | 2024-03-03 | 78
ROWS 사용시
SELECT student_name, exam_date, score,
AVG(score) OVER (
ORDER BY exam_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS running_avg
FROM student_scores
ORDER BY exam_date, student_name;
결과
student_name | exam_date | score | running_avg
김철수 | 2024-03-01 | 85 | 85.0
이영희 | 2024-03-01 | 85 | 85.0
박민수 | 2024-03-02 | 90 | 86.7
최지영 | 2024-03-03 | 78 | 84.5
마지막 평균만 보자.
김철수 : 평균 (85 철수만)
이영희 : 평균 (85 철수와 영희의 평균)
박민수 : 평균 (86.7 철수, 영희 그리고 민수의 평균)
최지영 : 평균 (78 철수, 영희, 민수 그리고 지영의 평균)
RANGE 사용
SELECT student_name, exam_date, score,
AVG(score) OVER (
ORDER BY exam_date
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS running_avg
FROM student_scores
ORDER BY exam_date, student_name;
student_name | exam_date | score | running_avg
김철수 | 2024-03-01 | 85 | 85.0
이영희 | 2024-03-01 | 85 | 85.0
박민수 | 2024-03-02 | 90 | 86.7
최지영 | 2024-03-03 | 78 | 84.5
- 김철수 (3월1일, 85점): 평균 85.0 (같은 날 모든 학생)
- 이영희 (3월1일, 85점): 평균 85.0 (같은 날 모든 학생)
- 박민수 (3월2일, 90점): 평균 86.7 (3월1일 학생들 + 본인)
- 최지영 (3월3일, 78점): 평균 84.5 (모든 학생)
결국 날짜를 기준으로 묶어서 같은 날짜에 있는 학생들의 평균을 구한다. 쉽게 말해 ROW는 개별 줄 서기 RANGE는 그룹으로 줄 세워 놓기다.
언제 어떤 것을 사용할까?
row를 사용할 때:
- 각 개별 레코드를 독립적으로 처리하고 싶을 때
- 순차적인 누적 계산이 필요한할 때
- 행의 물리적 순서가 중요할 때
RANGE를 사용하는 경우
- 같은 기준값을 가진 데이터를 하나의 그룹으로 처리하고 싶을 때
- 동점자나 동일 날짜의 데이터를 공평하게 처리하고 싶을 때
- 논리적 그룹핑이 필요할
실무 활용 예시
ROWS : 각 주문을 개별로 처리해서 누적 매출을 순차적으로 계산한다.
RANGE : 같은 날짜의 모든 주문을 묶어서 일별 누적 매출을 계산한다.
'MYSQL > 개념' 카테고리의 다른 글
코호트란? (Cohort) (0) | 2025.07.02 |
---|---|
윈도우함수 잘 쓰기 (0) | 2025.06.27 |
SQL에서 중간값 구하기 (0) | 2025.06.24 |
INSTR() (0) | 2025.06.21 |
언피펏(unpivot) (0) | 2025.06.19 |