์›๋ž˜์˜ 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๊ฐœ์”ฉ ๋ฐฐ์ •๋œ๋‹ค.

+ Recent posts