SQL์ ์๋์ฐ ํจ์๋ ํ๊ณผ ํ ๊ฐ์ ๋น๊ต, ์ฐ์ฐ, ์ ์ํ๊ธฐ ์ํ ํจ์์ด๋ค. ๋ถ์ํจ์ ๋๋ ์์ํจ์๋ผ๊ณ ํ๊ธฐ๋ ํ๋ค. ๋ค๋ฅธ ํจ์๋ค์ฒ๋ผ ์ค์ฒฉํด์ ์ฌ์ฉํ ์๋ ์์ง๋ง ์๋ธ์ฟผ๋ฆฌ์์๋ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
# ์๋์ฐ ํจ์ ๊ธฐ๋ณธ ๋ฌธ๋ฒ
์๋์ฐ ํจ์์๋ OVER ๋ฌธ๊ตฌ๊ฐ ํ์๋ก ๋ค์ด๊ฐ๋ค.
SELECT ์๋์ฐํจ์ OVER([PARTITION BY ์ปฌ๋ผ] [ORDER BY ์ปฌ๋ผ]) [AS ๋ณ์นญ]
FROM ํ
์ด๋ธ๋ช
;

1. ์์ ํจ์
1) ROW_NUMBER
ROW_NUMBER์ ๋์ผํ ๊ฐ์ด์ด๋ ๊ณ ์ ํ ์์๋ฅผ ๋ถ์ฌํ๋ค. (๋ค๋ฅธ ์์)
SELECT JOB, ENAME, SAL,
ROW_NUMBER() OVER (PARTITION BY JOB ORDER BY SAL DESC) JOB_RANK
FROM EMP;
JOB ENAME SAL JOB_RANK
--------- ---------- ---------- ----------
ANALYST FORD 3000 1
ANALYST SCOTT 3000 2
CLERK MILLER 1300 1
CLERK ADAMS 1300 2
CLERK JAMES 950 3
CLERK SMITH 800 4
# ๋ฌธ์ ์ค๋ช
job๋ณ๋ก ์นดํ
๊ณ ๋ฆฌ๋ฅผ ๋๋๋ฉฐ ์์๋ sal์ ๋ด๋ฆผ์ฐจ์ ์์๋ก ๋ญํฌ๋ฅผ ๋งค๊ธด๋ค
2) RANK
RANK๋ ๋์ผํ ๊ฐ์ ๋ํด ๊ฐ์ ์์๋ฅผ ๋ถ์ฌํ๋ค
๋์ผํ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ์์๋ 1,1,3,4,4,6 ์ด๋ฐ์์ธ ์
ORDER BY๋ฅผ ํฌํจํ ์ฟผ๋ฆฌ๋ฌธ์์ ํน์ ์ปฌ๋ผ์ ์์๋ฅผ ๊ตฌํ๋ ํจ์์ด๋ค. PARTITION ๋ด์์ ์์๋ฅผ ๊ตฌํ ์๋ ์๊ณ ์ ์ฒด ๋ฐ์ดํฐ์ ๋ํ ์์๋ฅผ ๊ตฌํ ์๋ ์๋ค.
์๋ฅผ ๋ค์ด ๋์ผํ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ์์๋ 1,1,3,4,4,6 ์ด๋ฐ์์ธ ์
SELECT JOB, ENAME, SAL,
RANK() OVER (PARTITION BY JOB ORDER BY SAL DESC) JOB_RANK
FROM EMP;
JOB ENAME SAL JOB_RANK
--------- ---------- ---------- ----------
ANALYST FORD 3000 1
ANALYST SCOTT 3000 1
CLERK MILLER 1300 1
CLERK ADAMS 1300 1
CLERK JAMES 950 3
CLERK SMITH 800 4
3) DENSE_RANK
DENSE_RANK๋ ๋์ผํ ๊ฐ์ ๋ํด ๋์ผ ์์๋ฅผ ๋ถ์ฌํ๋ค (๊ฐ์ ์์)
๋์ผํ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ์์๋ 1,1,2,3,3,4 ์ด๋ฐ ์
RANK์ ์๋๋ฒ์ ๋์ผ, ๋์ผํ ๊ฐ์ ๋ํด์๋ ๊ฐ์ ์์๋ฅผ ๋ถ์ฌํ๊ณ ์ค๊ฐ ์์๋ฅผ ๋น์ฐ์ง ์๋๋ค.
SELECT JOB, ENAME, SAL,
DENSE_RANK() OVER (PARTITION BY JOB ORDER BY SAL DESC) JOB_RANK
FROM EMP;
JOB ENAME SAL JOB_RANK
--------- ---------- ---------- ----------
ANALYST FORD 3000 1
ANALYST SCOTT 3000 1
CLERK MILLER 1300 1
CLERK ADAMS 1300 1
CLERK JAMES 950 2
CLERK SMITH 800 3
# Reference