Range between preceding and following 문법 질문 0 3 143

by guest [Oracle 기초] oracle winodws function range [2019.06.11 09:38:18]


EMPNO ENAME JOB SAL1 SAL2
7902     FORD     ANALYST     3000     3000
7369     SMITH     CLERK     800     3050
7900     JAMES     CLERK     950     3050
7934     MILLER     CLERK     1300     3050
7566     JONES     MANAGER     2975     8275
7698     BLAKE     MANAGER     2850     8275
7782     CLARK     MANAGER     2450 8275
7839     KING     PRESIDENT     5000     5000
7499     ALLEN     SALESMAN     1600     5600
7521     WARD     SALESMAN     1250     5600
7654     MARTIN SALESMAN     1250     5600
7844     TURNER     SALESMAN     1500     5600
select empno, ename, job, sal as sal1, sum(sal) over (partition by job order by empno range between 7900 preceding and 7900 following) as sal2 from emp;

하니까 위의 결과가 나왔는데요.

 

range 대신에 rows 의 경우에는

그러니까 rows between 1 preceding and 2 following 이렇게 하면

행 마다 1행 앞의 값과 2행 뒤의 값을 읽어서 해당 행의 값과 합치는 건 알겠는데 

 

range는 아무리 봐도 결과값이 어떤 식으로 나오는지 당최 모르겠습니다. 기준이 뭔지 뭔가 규칙이 안 보여요. 

범위 7900~7900 을 564~7900 으로 하면 MILLER CLERK 의 SAL2 값이 2250이 됩니다. 565까지는 3000이다가 딱 564부터 바뀝니다. 

 

인터넷에 있는 설명이라고는 커뮤니티나 블로그에 몇 안 되는 윈도우 함수 관련 글 중에 부분적으로 적혀 있는게 전부고 

여기에 대해서 자세하게 나와있는게 없습니다.

sql 전문가 가이드 책에도 보면 따로 항목이 있는게 아니라 윈도우 함수, 집계 이런 거 설명하면서 예제에만 갑자기 잠깐 등장하고 없습니다. 

이게 설명은 논리적인 주소에 의해 행 집합을 지정 이러는데 이 말 자체가 무슨 뜻인지를 모르겠습니다. 논리적인 주소라는게 어떤 걸 의미하죠? 

DB 내부 (일치하는) 주소값에 따라 계산이 된다는 건가요? 그럼 디버깅 안 해보는 이상 모르지 않나요? 시험에 결과값을 적어라 이런 게 나와서요. 

 

오픈챗에 계시는 DBA분들한테 물어봐도 이 문법에 대해서 속쉬원하게 대답해주는 사람이 없습니다. 모르는 건지 여기에 대해선 대답 자체를 안 해요.

by 마농 [2019.06.11 10:15:30]

정렬 기준항목의 값을 기준으로 범위를 정합니다.
JOB 을 그룹기준으로 하여 EMPNO 로 정렬하네요.
CLERK 을 기준으로 하여 MILLER 의 EMPNO 는 7934 인데
7934 를 기준으로 564 앞의 자료까지가 범위가 됩니다.
7934 - 564 = 7370  -- SMITH 제외
7934 - 565 = 7369  -- SMITH 포함
따라서 EMPNO 7369 인 SMITH 가 포함되려면 565 이상의 값이 나와야 하네요.
http://gurubee.net/lecture/2829


by guest [2019.06.11 11:47:25]

감사합니다. 이제 이해가 되네요.  근데 조건을 바꿨더니 이해가 안 돼서 한 번 더 여쭙겠습니다. 

SELECT MGR, ENAME, SAL, SUM(SAL) OVER(PARTITION BY MGR ORDER BY SAL RANGE between 0 PRECEDING and 0 following) AS MGR_SUM FROM EMP;

로 조회를 하니

MGR   ENAME     SAL    MGR_SUM

7566    FORD       3000     3000
7698    JAMES      950       950
7698    WARD      1250     2500
7698    MARTIN    1250     2500
7698    TURNER    1500     1500
7698    ALLEN      1600     1600
7782    MILLER     1300     1300
7839    CLARK      2450     2450
7839    BLAKE      2850     2850
7839    JONES     2975      2975
7902    SMITH     800       800
(null)    KING      5000      5000

라는 결과가 나왔는데 range 범위의 숫자와는 무관하게 저 부분만 2500으로 동일하게 계속 나오는 것 같네요. 

empno 로 order by 했을 때와 sal 로 order by 했을 때의 결과가 같은 맥락으로 이해가 되지 않습니다.


by 마농 [2019.06.11 12:25:09]

(1250 - 0) ~ (1250 + 0) 까지가 범위죠.
1250 ~ 1250 사이 값이 두개 있으니 합치면 2500

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