Database/Oracle2012. 2. 3. 11:09


1. RANK()함수는 말 그대로 랭킹, 즉 순위를 반환하는 함수이다.

SELECT EMPLOYEE_ID, SALARY,
 RANK() OVER (ORDER BY SALARY DESC) SALARY_RANKING
FROM EMPLOYEES;

2. DENSE_RANK()함수 역시 순위를 반환하지만 사원 급여가 같아 공돈 2위가 2명일 경우 3위는 사라지고 그 다음 4위가 반환되는데 2위 다음 3위가로 바로 나오게 할 경우 사용하는 함수이다.

SELECT EMPLOYEE_ID, SALARY,
 RANK() OVER (ORDER BY SALARY DESC) RANKING1,
 DENSE_RANK() OVER (ORDER BY SALARY DESC) RANKING2
FROM EMPLOYEES;


3. ROW_NUMBER함수는 1부터 시작해서 각 로우별로 순차적으로 값을 반환하다. 중복없음.

SELECT EMPLOYEE_ID, SALARY,
 RANK() OVER (ORDER BY SALARY DESC) RANKING1,
 DENSE_RANK() OVER (ORDER BY SALARY DESC) RANKING2,
 ROW_NUMBER() OVER (ORDER BY SALARY DESC) RANKING3
FROM EMPLOYEES;


--조회 결과(오라클 기본계정인 HR로 테스트를 해보았다.)

=> RANKING 1, 2, 3 이 서로 다른 결과를 나타내는 것을 알 수 있다.


4. 응용편 : ROW_NUMBER()함수를 이용하여 상위 N명의 명단을 추출해보자. 물론 이 경우 인라인뷰를 사용한다.

SELECT T.*
 FROM ( SELECT DEPARTMENT_ID, LAST_NAME, SALARY ,
                ROW_NUMBER() OVER(PARTITION BY DEPARTMENT_ID
         ORDER BY SALARY DESC) SAL
              FROM EMPLOYEES) T
WHERE T.SAL <= 3;

=> partion by 를 이용함으로서 부서별로 상위 3명을 추출하는 쿼리.

--조회결과(이 역시도 오라클 기본계정인 HR로 테스트)

==> 부서별로 상위 3명까지 나타내는 것을 알 수 있다.

출처 : 극히일부분 자작 + http://bench87.tistory.com/182

Posted by 아로나