CUME_DIST()
누적분포 : 확률변수가 어떤 특정한 값보다 같거나 작을 확률, 모든 가능한 확률의 합은 1이다.
NTILE(숫자)
RATIO_TO_REPORT
LAG(컬럼명, 값을 가져올 행의 위치, 값이 없을 경우 기본값)
LEAD(컬럼명, 값을 가져올 행의 위치, 값이 없을 경우 기본값)
-- 20번 사원의 이름, 봉급, 누적분산을 출력해보자.
SELECT ENAME, SAL,
CUME_DIST() OVER (ORDER BY SAL) " 누적분산 "
FROM C##SCOTT.EMP
WHERE DEPTNO = 20;
출력결과
ENAME SAL 누적분산
---------- ---------- ----------
SMITH 800 .2
ADAMS 1100 .4
JONES 2975 .6
FORD 3000 1
SCOTT 3000 1
-- 사원의 봉급을 기준으로 4등분 하자.
SELECT ENAME, SAL,
NTILE(4) OVER (ORDER BY SAL) " 4등분 "
FROM C##SCOTT.EMP;
출력결과
ENAME SAL 4등분
---------- ---------- ----------
SMITH 800 1
JAMES 950 1
ADAMS 1100 1
WARD 1250 1
MARTIN 1250 2
MILLER 1300 2
TURNER 1500 2
ALLEN 1600 2
CLARK 2450 3
BLAKE 2850 3
JONES 2975 3
SCOTT 3000 4
FORD 3000 4
KING 5000 4
-- RATIO_TO_REPORT를 이용해서 해당 구간을 차지하는 비율을 리턴해보자.
-- 50000원을 봉급이 차지하는 비율에 따라 나눠준다고 할 때 각 사원은 얼마를 받을 수 있을지 추출하자.
SELECT ENAME, SAL,
RATIO_TO_REPORT(SAL) OVER() AS "비 율",
TRUNC(RATIO_TO_REPORT(SAL) OVER()*50000) AS "인상될 월급"
FROM C##SCOTT.EMP;
출력결과
ENAME SAL 비 율 인상될 월급
---------- ---------- ---------- ----------
SMITH 800 2.8E-02 1378
ALLEN 1600 5.5E-02 2756
WARD 1250 4.3E-02 2153
JONES 2975 1.0E-01 5124
MARTIN 1250 4.3E-02 2153
BLAKE 2850 9.8E-02 4909
CLARK 2450 8.4E-02 4220
SCOTT 3000 1.0E-01 5167
KING 5000 1.7E-01 8613
TURNER 1500 5.2E-02 2583
ADAMS 1100 3.8E-02 1894
JAMES 950 3.3E-02 1636
FORD 3000 1.0E-01 5167
MILLER 1300 4.5E-02 2239
ENAME SAL 비 율 인상될 월급
---------- ---------- ---------- ----------
SMITH 800 0.028 1378
ALLEN 1600 0.055 2756
WARD 1250 0.043 2153
JONES 2975 0.1 5124
MARTIN 1250 0.043 2153
BLAKE 2850 0.098 4909
CLARK 2450 0.084 4220
SCOTT 3000 0.1 5167
KING 5000 0.17 8613
TURNER 1500 0.052 2583
ADAMS 1100 0.038 1894
JAMES 950 0.033 1636
FORD 3000 0.1 5167
MILLER 1300 0.045 2239
SELECT ENAME, DEPTNO, SAL,
LAG(SAL, 1, 0) OVER (ORDER BY SAL) AS NEXT_SAL,
LAG(SAL, 1, SAL) OVER (ORDER BY SAL) AS NEXT_SAL02,
LAG(SAL, 1, SAL) OVER (PARTITION BY DEPTNO ORDER BY SAL) AS NEXT_SAL03
FROM C##SCOTT.EMP;
출력결과
ENAME DEPTNO SAL NEXT_SAL NEXT_SAL02 NEXT_SAL03
---------- ---------- ---------- ---------- ---------- ----------
SMITH 20 800 0 800 800
JAMES 30 950 800 800 950
ADAMS 20 1100 950 950 800
MARTIN 30 1250 1100 1100 950
WARD 30 1250 1250 1250 1250
MILLER 10 1300 1250 1250 1300
TURNER 30 1500 1300 1300 1250
ALLEN 30 1600 1500 1500 1500
CLARK 10 2450 1600 1600 1300
BLAKE 30 2850 2450 2450 1600
JONES 20 2975 2850 2850 1100
FORD 20 3000 2975 2975 3000
SCOTT 20 3000 3000 3000 2975
KING 10 5000 3000 3000 2450
LAG(SAL, 1, 0)
봉급의 첫번째 전 행의 값을 가져오며, 값이 없을 경우엔 0을 리턴하라는 의미이다.
SAL NEXT_SAL
---------- ----------
800 0 - 전 행이 존재하지 않는다. 따라서 0 리턴
950 800 - 전 행은 800
1100 950 - 전 행은 950
1250 1100 - 전 행은 1100
1250 1250 - .
1300 1250 - .
1500 1300 - .
1600 1500
2450 1600
2850 2450
2975 2850 - .
3000 2975 - .
5000 3000 - 전 행은 2975
LAG(SAL, 1, SAL)
봉급의 첫번째 전 행 값을 가져오며, 값이 없을 경우엔 봉급을 리턴
SAL NEXT_SAL02
---------- ----------
800 800 - 전 행이 존재하지 않는다. 따라서 봉급인 800을 리턴
950 800 - 전 행은 800
1100 950 - 위와 동일한 로직
1250 1100
1250 1250
1300 1250
1500 1300
1600 1500
2450 1600
2850 2450
2975 2850
3000 2975
3000 3000
5000 3000 - 위와 동일한 로직, 전 행은 3000
LAG(SAL, 1, SAL) - PARTITION BY DEPTNO ORDER BY SAL
부서번호 파티션 내에서, 봉급의 첫번째 전 행 값을 가져오며, 값이 없을 경우엔 봉급을 리턴
DEPTNO SAL NEXT_SAL03
---------- ---------- ----------
20 800 800 - *1리턴
30 950 950 - ^1리턴
20 1100 800 - *1리턴
30 1250 950 - ^1리턴
30 1250 1250 - ^2리턴
10 1300 1300 - (1)리턴
30 1500 1250 - ^3리턴
30 1600 1500 - ^4리턴
10 2450 1300 - (1)리턴
30 2850 1600 - ^5리턴
20 2975 1100 - *2리턴
20 3000 3000 - *4리턴
20 3000 2975 - *3리턴
10 5000 2450 - (2)리턴
SELECT ENAME, DEPTNO, SAL,
LEAD(SAL, 1, 0) OVER (ORDER BY SAL) AS NEXT_SAL,
LEAD(SAL, 1, SAL) OVER (ORDER BY SAL) AS NEXT_SAL02
FROM C##SCOTT.EMP;
출력결과
ENAME DEPTNO SAL NEXT_SAL NEXT_SAL02
---------- ---------- ---------- ---------- ----------
SMITH 20 800 950 950
JAMES 30 950 1100 1100
ADAMS 20 1100 1250 1250
WARD 30 1250 1250 1250
MARTIN 30 1250 1300 1300
MILLER 10 1300 1500 1500
TURNER 30 1500 1600 1600
ALLEN 30 1600 2450 2450
CLARK 10 2450 2850 2850
BLAKE 30 2850 2975 2975
JONES 20 2975 3000 3000
SCOTT 20 3000 3000 3000
FORD 20 3000 5000 5000
KING 10 5000 0 5000