์๋์ DATASET
SELECT ENAME, JOB, SAL
FROM EMP
ORDER BY JOB, SAL DESC;
WINDOW ์ ์ฉ
: ๋ถ์๋ณ ๋์ ์ฐ๋ด
SELECT JOB, SUM(SAL) OVER (PARTITION BY JOB
ORDER BY SAL DESC
ROWS UNBOUNDED PRECEDING) --WINDOWING์
AS SUM_SAL
FROM EMP;
ROWS
ํ์ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฐ์ฐ์ ์ฐธ์ฌํ ํ์ ์ ํํ๋ค.
ROWS์์
: ๊ฐ ๋ถ์๋ณ ์นผ๋ผSAL์ ๋์ ํฉ์ ๊ตฌํ๋ ์นผ๋ผ์ ์์ฑํด๋ผ.
SELECT JOB, ENAME, SAL,
SUM(SAL) -- SAL ์นผ๋ผ์ผ๋ก SUM์ฐ์ฐ์ ํ ๊ฑด๋ฐ,
OVER (PARTITION BY JOB -- JOB์ ๊ธฐ์ค์ผ๋ก ๋๋๊ณ ,
ORDER BY SAL -- ํํฐ์
๋ด๋ถ ์์์ SAL๋ก ์ ๋ ฌํ ๊ฑด๋ฐ
ROWS UNBOUNDED PRECEDING) -- ํํฐ์
๋งจ ์์ ์์นํด์๋ ํ๋ถํฐ ํ์ฌ ํ๊น์ง ์ฐ์ฐํด
AS CUME_SAL
FROM EMP;

* ์๋ก์ด JOB๋ง๋ค UNBOUNDED PRECEDING ์์
* ํํฐ์ ์์ ๋ฒ์ด๋๋ ๊ณ์ฐ์ ๋ง๋ค์ด๋ด์ง๋ ์๋๋ค
๋ฒ์ ์ง์ ์์
ROWS UNBOUNDED PRECEDING : ์๋์ฐ ํจ์์ ์ฐ์ฐ์ ๋งจ ์์์๋ถํฐ ํ์ฌ ํ๊น์ง
ROWS UNBOUNDED FOLLOWING : ์๋์ฐ ํจ์ ์ฐ์ฐ์ ํ์ฌ ํ์์ ๋งจ ์๋ ํ๊น์ง ํฌํจํด ๊ณ์ฐ
ROWS 1 PRECEDING : ์๋์ฐ ํจ์์ ์ฐ์ฐ์ ํ ์นธ ์ ํ๋ถํฐ ํ์ฌ ํ๊น์ง ํฌํจํด์ ๊ณ์ฐ
ROWS 2 FOLLOWING : ์๋์ฐ ํจ์์ ์ฐ์ฐ์ ํ์ฌ ํ๋ถํฐ ๋ ์นธ ์๋๊น์ง ํฌํจํด์ ๊ณ์ฐ
ROWS BETWEEN A AND B
SELECT JOB, ENAME, SAL,
SUM(SAL)
OVER (ORDER BY SAL
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
AS CUME_SAL
FROM EMP;
ROWS ๋ฒ์ ์ง์ ์์
: ์ ํ์ SAL (1PRECEDING)๊ณผ ํ์ฌ ํ์ SAL ์นผ๋ผ (CURRENT ROW)์ ํฉ์ ๊ตฌํด๋ผ
SELECT JOB, ENAME, SAL,
SUM(SAL)
OVER (ORDER BY SAL
ROWS 1 PRECEDING)
AS CUME_SAL
FROM EMP;
๋ฒ์ ์ง์ ์์
ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING
A. ์ต๊ณ ์์ ํ๋ถํฐ ๋ ์นธ ์๋ ํ๊น์ง ํฌํจํด์ ๊ณ์ฐ
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
= ROWS 2 PRECEDING
A. ๋์นธ ์์ ํ๋ถํฐ ํ์ฌ ํ๊น์ง ๊ณ์ฐ
ROWS 1 PRECEDING AND UNBOUNDED FOLLOWING
A. ํ ์นธ ์์ ํ๋ถํฐ ์ตํ๋จ ํ๊น์ง ๊ณ์ฐ
ROWS 1 FOLLOWING AND 3 FOLLOWING
A. ํ์ฌ ํ์ผ๋ก๋ถํฐ ํ ์นธ ์๋ ํ๋ถํฐ ์ธ ์นธ ์๋ ํ๊น์ง ์ด ์ธ ๊ฐ ํ์ ๋ํด ๊ณ์ฐ (๋๋ ์ฐ์ฐ์ ์ฐธ์ฌํ์ง ๋ชปํจ)
RANGE
์นผ๋ผ์ '๊ฐ'์ ๊ธฐ์ค์ผ๋ก ์ฐ์ฐ์ ์ฐธ์ฌํ ํ์ ์ ํํ๋ค.
RANGE ์์
SELECT JOB, ENAME, SAL,
SUM(SAL) OVER(ORDER BY SAL
RANGE 150 PRECEDING) -- ํ์ฌ ์นผ๋ผ๋ณด๋ค ์๊ธฐ๋ ํ๋ฐ, ๊ทธ ์ฐจ์ด๊ฐ "150์ดํ" ์ธ ๊ฒ๋ค
AS CUME_SAL
FROM EMP
WHERE JOB = 'CLERK' OR JOB = 'SALESMAN';

* JAMES : SAL=950, SMITH์ 800์ด 150๋ณด๋ค ์ฐจ์ด๊ฐ ํฌ์ง ์์ผ๋ฏ๋ก ์ฐ์ฐ์ ์ฐธ์ฌ์์ผ์ค๋ค. 800+950 = 1750
* TURNER : SAL = 1500, 1500-150=1350์ด์์ด์ด์ผ ์ฐ์ฐ์ ์ฐธ์ฌ์ํฌ ์ ์๋๋ฐ, MILLER์ SAL์ด 1300์ด๋ฏ๋ก ์ฐ์ฐ์ ๋์์ด ๋์ง ๋ชปํ๋ค.
๋ฒ์ ์ง์ ์์
RANGE 150 PRECEIDNG
A. ํ์ฌ ์นผ๋ผ์ ๊ธฐ์ค์ผ๋ก 150์ดํ๋ก ์ฐจ์ด๋๋ ํ์ ์ ํ์ ์ผ๋ก ๊ณ์ฐํ๋ค.
RANGE UNBOUNDED PRECEIDNG
A. ํ์ฌ ์นผ๋ผ์ ๊ฐ์ ํฌํจํ๊ณ , ๊ธฐ์ค์ผ๋ก ์ผ์ ์์ ๊ฐ๋ค์ ๋ชจ๋ ์ ํํ์ฌ ๊ณ์ฐํ๋ค.
RANGE BETWEEN 150 PRECEDING AND 150 FOLLOWING
A. ํ์ฌ ์นผ๋ผ๋ณด๋ค 150์ดํ ~ 150์ด์๊น์ง ๊ฐ์ ๊ฐ๋ ํ์ ์ ํํ์ฌ ๊ณ์ฐํ๋ค.
RANGE BETWEEN UNBOUNDED PRECEIDNG AND CURRENT ROW
= RANGE UNBOUNDED PRECEDING
A. ๊ฐ์ฅ ์์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ถํฐ ํ์ฌ ํ์ ๊ฐ๊น์ง ์ ํํ์ฌ ๊ณ์ฐํ๋ค.
์์ํจ์
โ RANK()
์ค๋ณต ๊ฐ์ด ์๋ ํ์๊ฒ ๊ณต๋ ๋ฑ์๋ฅผ ๋ถ์ฌํ๊ณ , ๋ค์ ๋ฑ์๋ฅผ ์ ๊ฑฐํ๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ฐ์์ ์ด์ง ์์ ๋ฑ์๊ฐ ๋์ฌ ์ ์๋ค.
SELECT ENAME, SAL, RANK()
OVER (ORDER BY SAL) -- ORDER BY SAL๋ก ๊ธฐ์ค์ ์ผ์ RANK๋ฅผ ๋งค๊ธด๋ค
AS RANK
FROM EMP;

์๋ฌธ
SELECT ENAME, JOB, SAL, RANK()
OVER (PARTITION BY JOB ORDER BY SAL DESC) RANK -- JOB์ ๊ธฐ์ค์ผ๋ก ํํฐ์
์ฒ๋ฆฌํ๊ณ , ๊ฐ๊ฐ์ ํํฐ์
์์ SAL์นผ๋ผ์ ๋ค์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ RANKํจ์๋ฅผ ์ ์ฉํ๋ค
FROM EMP;

โก DENSE_RANK() * DENSE : ๋๋๊ฐ ์ง์, ๋นฝ๋นฝํ
๋์ผ ๋ฑ์๋ฅผ ๊ฐ์ง ์ฌ๋์ ์์ ์๊ด์์ด ๊ทธ ๋ค์ ๋ฑ์ ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋ฑ์๋ ๋ฌด์กฐ๊ฑด ์ฐ์์ ์ด๋ค.
* RANKํจ์๋ 1๋ฑ ๋์ ์๊ฐ 99๋ช
์ด๋ฉด ๋ฐ๋ก 100๋ฑ์ด ๋์จ๋ค -> ๋ฑ์์ ์๋ฏธ๊ฐ ํด์
SELECT ENAME, SAL, DENSE_RANK() OVER (ORDER BY SAL DESC) AS RANK FROM EMP;
โข ROW_NUMBER()
ํ์ ๋ฒํธ๋ฅผ ์๋ฏธํ๋ค.
์์๋ฅผ ์ ํ๊ธฐ๋ ํ์ง๋ง ๊ฐ์ ๊ฐ์ ๊ฐ์ ธ๋ ํ์ ๋ฒํธ๊ฐ ๊ฐ์ ์๋ ์๋ค.
SELECT ENAME, SAL, ROW_NUMBER() OVER (ORDER BY SAL DESC) AS RANK
FROM EMP;

๊ทธ๋ฃน ๋ด ํ ์์ ํจ์
โ FIRST_VALUE : ๋๋์ด์ง ํํฐ์ ์์ ๊ฐ์ฅ ๋จผ์ ๋์จ ๊ฐ์ ์ถ๋ ฅํ๋ค.
SELECT DEPTNO, ENAME, SAL,
FIRST_VALUE(ENAME) --ํํฐ์
์์ ๋๋ ๊ฐ์ ENAME๊ธฐ์ค์ผ๋ก
OVER (PARTITION BY DEPTNO ORDER BY SAL DESC
ROWS UNBOUNDED PRECEDING)
AS ENAME_FV
FROM EMP;

โก LAST_VALUE : ๋๋์ด์ง ํํฐ์ ์์ ๊ฐ์ฅ ๋์ค์ ๋์จ ๊ฐ์ ์ถ๋ ฅํ๋ค.
SELECT DEPTNO, ENAME, SAL,
LAST_VALUE (ENAME) OVER (PARTITION BY DEPTNO ORDER BY SAL DESC
ROWS BETWEEN CURRENT ROW AND
UNBOUNDED FOLLOWING)
AS ENAME_LV
FROM EMP;

โข LAG : ํด๋น ํ์ ๊ธฐ์ค์ผ๋ก ์์ ํ์ ์ ํํ๋ค * lag : ์ง์ฐ๋
SELECT ENAME, HIREDATE, SAL,
LAG(SAL)
OVER(ORDER BY HIREDATE)
AS LAG_SAL
FROM EMP
WHERE JOB = 'SALESMAN';

SELECT ENAME, HIREDATE, SAL,
LAG(SAL,2)
OVER(ORDER BY HIREDATE)
AS LAG_SAL
FROM EMP
WHERE JOB = 'SALESMAN';

NULL๊ฐ ์ฒ๋ฆฌ
SELECT ENAME, HIREDATE, SAL,
LAG(SAL,2,1000)
OVER(ORDER BY HIREDATE)
AS LAG_SAL
FROM EMP
WHERE JOB = 'SALESMAN';

โฃ LEAD : ํด๋น ํ์ ๊ธฐ์ค์ผ๋ก ์๋์ ์์นํ ํ์ ๊ฐ์ ๊ฐ์ ธ์จ๋ค
SELECT ENAME, HIREDATE, SAL,
LEAD(SAL)
OVER(ORDER BY HIREDATE)
AS LEAD_SAL
FROM EMP
WHERE JOB = 'SALESMAN';

* LEAD(SAL, 2) : ๋ ํ์ ์๋๋ก ๋ด๋ ค๊ฐ ์นผ๋ผSAL์ ๊ฐ์ ๊ฐ์ ธ์จ๋ค
* LEAD(SAL, 2) : ๋์ด์ ์ฝ์ ํ์ด ์์ด NULL๊ฐ์ด ์์ฑ๋๋ ๊ฒฝ์ฐ, 1000์ผ๋ก ๋์ฒดํ๋ค.
๊ทธ๋ฃน ๋ด ๋น์จํจ์
โ RATIO_TO_REPORT
๊ฐ์ ๋น์จ์ ๋ํ๋ธ๋ค. ํจ์๊ฐ ์ ์ฉ๋๋ ์นผ๋ผ ๊ณต๊ฐ์ ๊ฐ์ ํฉ ์ค์์ ํด๋น ํ์ด ์ฐจ์งํ๋ ๋น์จ์ ๋ํ๋ธ๋ค. 0์ด์ 1์ดํ์ ์๋ก ๋ํ๋ธ๋ค.
SELECT ENAME, JOB, SAL,
ROUND(RATIO_TO_REPORT (SAL) OVER(), 2) -- ์ ์ฒด ํ์์ SAL์นผ๋ผ์ด ์ด๋์ ๋ ๋น์จ์ ์ฐจ์งํ๊ณ ์๋๊ฐ
AS RATIO
FROM EMP
WHERE JOB='SALESMAN';

โก PERCENT_RANK
์ ์ผ ๋จผ์ ๋์ค๋ ๊ฒ์ 0์ผ๋ก, ์ ์ผ ๋ฆ๊ฒ ๋์ค๋ ๊ฒ์ 1๋ก ์ฒ๋ฆฌํ์ฌ ๊ฐ์ด ์๋ ํ์ ์์๋ณ ๋ฐฑ๋ถ์จ์ ๊ตฌํ๋ค.
SELECT DEPTNO, ENAME, JOB, SAL,
PERCENT_RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) -- ์ ์ฒด ํ์์ SAL์นผ๋ผ์ด ์ด๋์ ๋ ๋น์จ์ ์ฐจ์งํ๊ณ ์๋๊ฐ
AS PR
FROM EMP;

* 0~1์ ํญ๋ชฉ ์ ๋งํผ ๋ฑ๋ถํ๋ค. (3ํญ๋ชฉ์ด๋ฉด 2๋ฒ ์ปทํ )
1์ 2๋ฒ ์ปทํ ํด์ 3ํญ๋ชฉ์ด ๊ฐ์ ๋๋ ๊ฐ์ง๋ฉด 0 > 0.5 > 1
โข CUME_DIST
ํ์ฌ ํ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฑด์์ ๋ํด ๋์ ๋ฐฑ๋ถ์จ์ ๊ตฌํ๋ค. 0์ด ๋์ฌ ์ ์๋ค.
SELECT DEPTNO, ENAME, JOB, SAL,
ROUND(CUME_DIST() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC), 2) -- ์ ์ฒด ํ์์ SAL์นผ๋ผ์ด ์ด๋์ ๋ ๋น์จ์ ์ฐจ์งํ๊ณ ์๋๊ฐ
AS CD
FROM EMP;

โฃ NTILEํจ์
์ ์ฒด ๊ทธ๋ฃน์ N๋ฑ๋ถํ๋ค.
SELECT ENAME, SAL,
NTILE(4) OVER (ORDER BY SAL DESC)
AS TILE
FROM EMP;

[ํด์ค] NTILE(4)๋ 4๊ฐ์ ํ์ผ์ ๋ฐฐ์ ๋๋ค. 14๊ฐ์ ํ์ด ์กด์ฌํ๋ฏ๋ก 4๋ก ๋ฐฐ๋ถํ๋ฉด 2๊ฐ ๋จ๋๋ค.
์ด ๋จ๋ ๋ ๊ฐ์ ํ์ ์์ ํ์ผ(๊ทธ๋ฃน)๋ถํฐ ํ๋์ฉ ๋ฐฐ์ ํ๋ค. ๋ฐ๋ผ์ 1,2๋ฒ ๊ทธ๋ฃน์ ํญ๋ชฉ์ด 4๊ฐ์ฉ ๋ฐฐ์ ๋๊ณ , 3,4๋ฒ ๊ทธ๋ฃน์ 3๊ฐ์ฉ ๋ฐฐ์ ๋๋ค.
'๊ฐ์ธ๊ณต๋ถ > SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| 23. Oracle ์ฐ์ต๋ฌธ์ (๋ฏธ๊ธฐ์ฌ) (0) | 2021.10.07 |
|---|---|
| 20. ๋ํ๋ฏผ๊ตญ ์ง์ญ๋ณ ์๊ถ ๋ถ์ํด๋ณด๊ธฐ (+์ค๋ฅํด๊ฒฐ) (0) | 2021.10.04 |
| 17. ๋ถ์ํจ์, ์์ํจ์ (0) | 2021.10.01 |
| 10. Oracle ์ค๊ฐ์ฐ์ต๋ฌธ์ (0) | 2021.09.23 |
| 09. Oracle ์ค๊ฐ์ฐ์ต๋ฌธ์ (0) | 2021.09.22 |