본문 바로가기

카테고리 없음

ORACLE ROW_NUMBER v1.0

ORACLE ROW_NUMBER

 

 

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 을 나눌 때

오름차순으로 정렬하기 때문이 아닌가 싶다.

 

/*+ 실행계획에서 확인 */