sql 2009. 12. 16. 15:08

oracle ] rank() function


/*
순위와 관련된 오라클 함수

RANK()
ROW_NUMBER()
DENSE_RANK()

RANK 함수가 동일한 값에 대해서는 동일한 순위를 부여하는데 반해,
ROW_NUMBER 함수는 유니크한 순위를 부여한다.
DENSE_RANK()함수는 중복 RANK의 수와 무관하게 순위를 부여한다.

oracle 8i(8.1.6)이상
plsql내에서는 oracle 9i이상
*/

-- RANK() 함수를 사용하여 급여순으로 순위 부여
SELECT empno, ename, sal, RANK () OVER (ORDER BY sal DESC) AS RANK
FROM   emp


-- PARTITION BY를 이용해서 그룹별로 순위 부여
SELECT deptno, ename, sal,
       RANK () OVER (PARTITION BY deptno ORDER BY sal DESC) AS RANK
FROM   emp


-- 중복값과 무관하게 순위부여
SELECT empno, ename, sal, DENSE_RANK () OVER (ORDER BY sal DESC) AS RANK
FROM   emp


-- ROW_NUMBER()를 사용하여 유니크한 순서부여, 순위를 자세히 조정하고 싶으면 ORDER BY절 수정
SELECT empno, ename, sal,
       ROW_NUMBER () OVER (ORDER BY sal DESC, ename) AS ROW_NUMBER
FROM   emp


-- 다음 두 쿼리는 같은 결과를 반환, 직업별로 가장높은 월급을 받는사람
SELECT   a.ename, a.job, a.sal
FROM     emp a,
         (SELECT   MAX (sal) max_sal, job
          FROM     emp
          GROUP BY job) b
WHERE    a.sal = b.max_sal AND a.job = b.job
ORDER BY a.ename


SELECT   ename, job, sal
FROM     (SELECT ename, job, sal,
                 RANK () OVER (PARTITION BY job ORDER BY sal DESC) AS RANK
          FROM   emp)
WHERE    RANK = 1
ORDER BY ename