본문 바로가기
MYSQL/개념

ROWS와 RANGE()

by 수스리 2025. 7. 1.

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