2013년 10월 23일 수요일

[오라클분석함수 RANK]ORACLE SQL 함수(분석함수, 순위매기기) 오라클강좌

[오라클분석함수 RANK]ORACLE SQL 함수(분석함수, 순위매기기)



분석용 함수(Analytical Function)

RANK

RANK() OVER ( query_partition_clause  ORDER_BY clause) : 이전에 보았던 RANK 함수는 그룹함수로서의 기능을 하였다. 이번에는 분석기능을 하는,  즉 전체 행을 대상으로 각각의 행에 대해 순위를 계산하는 역할을 한다.

--> KOR 이름의 Table을 만들고 이름, 성적, 반 3개의 컬럼을 갖도록 구성하자. 아래의 create table문의 default 0이라는 의미는 marks에 값이 들어 오지 않은 경우에는 기본적으로 0이 입력된다는 의미이다.
SQL> create table kor (
  2  name varchar2(10) not null,
  3  marks number(3,0) default 0,
  4  ban number(1,0) not null)
  5  ;

테이블이 생성되었습니다.
SQL> insert into kor values ('가길동', 88, 1);
SQL> insert into kor values ('나길동', 64, 2);
SQL> insert into kor values ('다길동', 78, 1);
SQL> insert into kor values ('라길동', 99, 1);
SQL> insert into kor values ('마길동', 78, 1);
SQL> insert into kor values ('바길동', 89, 2);
SQL> commit;
커밋이 완료되었습니다.
--> 아래의 SQL문은 반에 관계없이 전체에서의 석차를 구하는 것이다. RANK와 DENSE_RANK의 차이에 대해서는 눈으로 확인하길 바란다.
SQL> select name "이름",
  2        marks "성적",
  3        ban "반",
  4        rank() over (order by marks desc) "석차1",
  5        dense_rank() over (order by marks desc) "석차2"
  6  from kor;

이름            성적        반      석차1      석차2
---------- ---------- ---------- ---------- ----------
라길동            99          1          1          1
바길동            89          2          2          2
가길동            88          1          3          3
다길동            78          1          4          4
마길동            78          1          4          4
나길동            64          2          6          5

6 개의 행이 선택되었습니다.
--> 아래의 예문은 반내에서의 석차를 구하는 예문이다. 주요한 키워드는 PARTITION BY이니 기억해 두기 바란다.
SQL> select name "이름",
  2            marks "성적",
  3            ban "반",
  4            rank() over (partition by ban
  5                      order by marks desc) "반 석차"
  6  from kor
  7  /

이름            성적        반    반 석차
---------- ---------- ---------- ----------
라길동            99          1          1
가길동            88          1          2
다길동            78          1          3
마길동            78          1          3
바길동            89          2          1
나길동            64          2          2
--> 그럼 위의 예문을 참고하여 EMP Table에서 부서별로 급여가 높은 순위를 알기 위해서는 어떻게 하는지는 아래의 예문을 통해 참고하자.
SQL> select ename, sal, deptno,
  2        rank() over (partition by deptno order by sal desc) "Ranking"
  3  from emp;

ENAME            SAL    DEPTNO      Ranking
---------- ---------- ---------- ----------
KING            5000        10          1
CLARK          2450        10          2
MILLER          1300        10        3
SCOTT          3000        20          1
FORD            3000        20          1
JONES          2975        20          3
ADAMS          1100        20        4
SMITH            800          20          5
 

댓글 없음:

댓글 쓰기