[윈도우 분석 함수 범위 설정] 질문있습니다. 0 4 1,061

by 부산광어 [2020.05.24 14:11:17]


윈도우 함수() 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 구문을 함께 사용해서 시작과 끝의 범위를 지정할 수 있던데, 둘을 구분하는 이유는 무엇인가요? 단순히, 물리주소와 논리주소라는 차이 때문인가요? 그렇다면, 어떤 것을 쓰는게 더 성능에 좋나요?

by 마농 [2020.05.25 08:26:22]

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 |

 


by 부산광어 [2020.05.25 13:29:49]

답변 감사합니다!

행단위가 ROWS 이라는 건 알겠는데,

값단위가 RANGE라는 말씀이 무슨 말인지 잘 이해가 되지 않습니다. ㅠㅠ

 


by 마농 [2020.05.25 13:40:52]

결과까지 비교해서 만들어 드렸으니 이해는 본인 몫입니다.
결과가 어떻게 다른지 비교해 보시고 스스로 이해하셔야죠.
"값"이라고 표현한 부분은 "정렬키값"을 의미합니다. 위 예문의 "cd 값"


by 부산광어 [2020.05.25 13:58:00]

제가 좀 더 신중히 생각을 하고 질문을 했어야 하는데 죄송합니다 ㅠ

시간 내주셔서  감사합니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입