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
'Database > Oracle' 카테고리의 다른 글
[펌] XMLAGG() 여러로우의 값을 하나의 컬럼으로 바꾸는 방법 (0) | 2012.03.11 |
---|---|
오라클 XMLAGG 함수 개요(펌) (0) | 2012.03.11 |
Oracle 비교분석함수 LAG() , LEAD() 함수 (0) | 2012.02.03 |
[펌] Oracle 페이징 처리하기 (0) | 2011.12.26 |
[펌] Oracle Client 설치 (0) | 2011.11.11 |