윈도우 함수() OVER(PARTITION BY [] ORDER BY [] ROWS | RANGE BETWEEN UNBOUNDED PRECEDING | PRECEDING | CURRENT ROW AND UNBOUNDED FOLLOWING | CURRENT ROW · ROWS : 윈도우 크기를 지정하기 위한 물리적인 단위로 행 집합을 지정 · RANGE : 윈도우 크기를 지정하기 위한 논리적인 주소에 의해 행 집합을 지정 · BETWEEN AND : 윈도우 시작과 끝 위치를 지정 · UNBOUNDED PRECEDING : 윈도우의 시작 위치가 첫번째 ROW · UNBOUNDED FOLLOWING : 윈도우의 마지막 위치가 마지막 ROW · CURRENT ROW : 윈도우의 시작 위치가 현재 ROW
구매한 책으로부터 가져온 윈도우 함수에 대한 내용입니다.
제가 의문인 점은, ROWS와 RANGE의 차이인데요
ROWS, RANGE 가릴 것 없이 BETWEEN AND 구문을 함께 사용해서 시작과 끝의 범위를 지정할 수 있던데, 둘을 구분하는 이유는 무엇인가요? 단순히, 물리주소와 논리주소라는 차이 때문인가요? 그렇다면, 어떤 것을 쓰는게 더 성능에 좋나요?
ROWS 는 행 단위 | RANGE 는 값 단위
다음과 같이 정렬키가 중복되는 경우에 결과가 다릅니다.
선택 기준은 성능이 아닌 목적입니다.
WITH t AS ( SELECT 1 cd, 10 v FROM dual UNION ALL SELECT 1, 10 FROM dual UNION ALL SELECT 2, 10 FROM dual UNION ALL SELECT 2, 10 FROM dual ) SELECT cd, v , SUM(v) OVER(ORDER BY cd) x1 , SUM(v) OVER(ORDER BY cd RANGE UNBOUNDED PRECEDING) x2 , SUM(v) OVER(ORDER BY cd RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) x3 , SUM(v) OVER(ORDER BY cd ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) x4 , SUM(v) OVER(ORDER BY cd, ROWNUM) x5 FROM t ; -- Result -- | cd | v | x1 | x2 | x3 | x4 | x5 | | 1 | 10 | 20 | 20 | 20 | 10 | 10 | | 1 | 10 | 20 | 20 | 20 | 20 | 20 | | 2 | 10 | 40 | 40 | 40 | 30 | 30 | | 2 | 10 | 40 | 40 | 40 | 40 | 40 |