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분들한테 물어봐도 이 문법에 대해서 속쉬원하게 대답해주는 사람이 없습니다. 모르는 건지 여기에 대해선 대답 자체를 안 해요.
정렬 기준항목의 값을 기준으로 범위를 정합니다.
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
감사합니다. 이제 이해가 되네요. 근데 조건을 바꿨더니 이해가 안 돼서 한 번 더 여쭙겠습니다.
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 했을 때의 결과가 같은 맥락으로 이해가 되지 않습니다.