ORACLE ROW_NUMBER
from OTN ROW_NUMBER | http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions137.htm#SQLRF06100
1. ROW_NUMBER
<SYNTAX>
è ROW_NUMBER () OVER -> ( [QUERY_PARTITION CLAUSE] -> ORDER_BY_CLAUSE)
ANALYTIC FUNCTION 이며 이 함수는 제공받는 ROW 에 대해 UNIQUE 한 수를 부여한다.
(파티션에 의해 반환되는 로우 혹은 쿼리에 의해 반환되는 로우에 대해)
부여하는 고유한 수는 1 부터 시작된다.
2. ROW_NUMBER 예제
<QUERY_PARTITION CLAUSE 생략>
SQL> select ename,deptno,empno,
2 row_number() over (order by empno) emp_rank
3 from emp;
ENAME DEPTNO EMPNO EMP_RANK
---------- ---------- ---------- ----------
SMITH 20 7369 1
ALLEN 30 7499 2
WARD 30 7521 3
JONES 20 7566 4
MARTIN 30 7654 5
BLAKE 30 7698 6
CLARK 10 7782 7
SCOTT 20 7788 8
KING 10 7839 9
TURNER 30 7844 10
ADAMS 20 7876 11
ENAME DEPTNO EMPNO EMP_RANK
---------- ---------- ---------- ----------
JAMES 30 7900 12
FORD 20 7902 13
MILLER 10 7934 14
14 rows selected.
결과를 보면 empno 에 의해 오름차순 정렬이 되어있다. 이는 row_number 의
order by clause 를 정의했기 때문에 나타나는 결과이다.
emp_rank 를 보면 empno 순서에 따라 1부터 값이 시작되는 것을 볼 수 있다.
결과 자체만 보면 empno 으로 정렬해 select list 에 rownum 을 정의한 것과
다를 바 없다.
<QUERY_PARTITION CLAUSE 사용>
SQL> select ename,deptno,empno,
2 row_number() over (partition by deptno order by empno) emp_rank
3 from emp
4 order by deptno,empno;
ENAME DEPTNO EMPNO EMP_RANK
---------- ---------- ---------- ----------
CLARK 10 7782 1
KING 10 7839 2
MILLER 10 7934 3
SMITH 20 7369 1
JONES 20 7566 2
SCOTT 20 7788 3
ADAMS 20 7876 4
FORD 20 7902 5
ALLEN 30 7499 1
WARD 30 7521 2
MARTIN 30 7654 3
ENAME DEPTNO EMPNO EMP_RANK
---------- ---------- ---------- ----------
BLAKE 30 7698 4
TURNER 30 7844 5
JAMES 30 7900 6
14 rows selected.
여기서는 partition clause 를 정의하였다. deptno 을 키로 사용하였고
이것이 가지는 의미는 각 부서에 따라 unique한 번호를 부여하겠다는 의미이다.
결과적으로 각 부서에 대해 empno 을 오름차순으로 정렬해 1부터 부여하는 결과가
나왔고 쿼리 4번째 줄의 order by deptno,empno 은 생략해도 결과가 동일하다.
empno 는 앞서 본 쿼리와 같은 맥락의 이유이며 deptno 의 경우 partition 을 나눌 때
오름차순으로 정렬하기 때문이 아닌가 싶다.
/*+ 실행계획에서 확인 */