윈도우절에서 궁금증 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 1 2 956

by jake3371 [Oracle 기초] [2019.09.23 03:11:12]


WITH TEMP AS (
SELECT 10 A FROM DUAL 
UNION ALL SELECT 10 FROM DUAL
UNION ALL SELECT 10 FROM DUAL
UNION ALL SELECT 10 FROM DUAL
UNION ALL SELECT 10 FROM DUAL
UNION ALL SELECT 20 FROM DUAL
UNION ALL SELECT 20 FROM DUAL
UNION ALL SELECT 30 FROM DUAL
UNION ALL SELECT 40 FROM DUAL
UNION ALL SELECT 50 FROM DUAL
UNION ALL SELECT 50 FROM DUAL
)
SELECT T.*,
       COUNT(T.A) OVER(ORDER BY T.A) AS B,
       
       COUNT(T.A) OVER(ORDER BY T.A
                       RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS C,
                       
       COUNT(T.A) OVER(ORDER BY T.A
                       ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS D
FROM TEMP T

 

 

 

1) 윈도우절 생략하면 디폴트로 'RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW' 인 것은 알고 있습니다.

그렇기 때문에 B컬럼과 C컬럼의 결과는 동일 합니다.

 

2) D컬럼 같은 경우는 'ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW' 을 명시 했기 때문에,

이전로우~현재로우 까지 윈도우결과셋에 포함 되므로 순차적으로 증가하는 형태를 띕니다.

 

여기서 질문 입니다.

B 컬럼의 값이 어떤 원리로 값이 산출되는지 궁금합니다.

RANGE는 보통 파티션된 데이터에서 날짜 컬럼을 논리적인 값으로 범위 지정하기 위해 사용하는데

위 예제처럼 'RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW' 형태로 사용했을 경우는

어떤 방식으로 어떤 원리로 작동되어 결과가 도출되는지 궁금합니다.

by jkson [2019.09.23 09:22:22]

range는 값 기준으로 집계하는 것입니다.

아래 쿼리로 설명해볼게요.

with t as
(
select 1 val from dual
union all
select 2 from dual
union all
select 3 from dual
union all
select 4 from dual
union all
select 5 from dual
union all
select 7 from dual
union all
select 8 from dual
union all
select 8 from dual
)
select val
, sum( val) over(order by val rows 2 preceding) rowsval
, sum( val) over(order by val range 2 preceding) rangeval
 from t

range 2 preceding이라는 것은 현재 값 기준으로 -2부터 현재 값까지라는 것입니다.

값 3을 기준으로 보면 1,2,3이 되겠고

값 7을 기준으로 보면 5,6,7이지만 위의 쿼리에서 6은 없으므로 5, 7만 sum 됩니다.

unbounded preceding을 하게 되면 처음 값부터이므로

말씀해주신 쿼리에서는 20 기준으로 보면 20보다 작은 값에서 20까지 총 카운트가 되므로 7이 카운트 되겠지요.

 


by jake3371 [2019.09.23 18:53:30]

감사합니다.

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