IT
[Oracle] 오라클 순위 함수
정미나
2010. 11. 22. 14:42
RANK()
- 순위를 반환하는 함수
SELECT EMPLOYEE_ID, SALARY,
RANK() OVER (ORDER BY SALARY DESC) SALARY_RANKING
FROM EPLOYEES;
RANK() OVER (ORDER BY SALARY DESC) SALARY_RANKING
FROM EPLOYEES;
DENSE_RANK()
- RANK()와 비슷하지만 중복된 순위 무시
SELECT EMPLOYEE_ID, SALARY,
DENSE_RANK() OVER (ORDER BY SALARY DESC) SALARY_RANKING
FROM EPLOYEES ;
DENSE_RANK() OVER (ORDER BY SALARY DESC) SALARY_RANKING
FROM EPLOYEES ;
ROW_NUMBER()
- 1부터 각 로우별로 순차적인 값을 반환
SELECT EMPLOYEE_ID, SALARY,
ROW_NUMBER() OVER (ORDER BY SALARY DESC) SALARY_RANKING
FROM EPLOYEES ;
ROW_NUMBER() OVER (ORDER BY SALARY DESC) SALARY_RANKING
FROM EPLOYEES ;
* 주의
- 잘못된 예
SELECT EMPLOYEE_ID, SALARY,
ROW_NUMBER() OVER (ORDER BY SALARY DESC) SALARY_RANKING
FROM EPLOYEES
WHERE ROWNUM < 11 ;
ROW_NUMBER() OVER (ORDER BY SALARY DESC) SALARY_RANKING
FROM EPLOYEES
WHERE ROWNUM < 11 ;
분석함수는 ORDER BY 절을 제외하고 가장 마지막에 처리가 되므로
WHERE 절에서 10건을 걸러낸 다음 ROW_NUMBER() 함수가 적용이 되어
원하는 결과가 나오지 않는다.
- 잘된 예
SELECT T.*
FROM ( SELECT DEPARTMENT_ID, LAST_NAME,
ROW_NUMBER() OVER ( PARTITION BY DEPARTMENT_ID
ORDER BY SALARY DESC ) SAL
FROM EMPLOYEES) T
WHERE T.SAL <= 3 ;
FROM ( SELECT DEPARTMENT_ID, LAST_NAME,
ROW_NUMBER() OVER ( PARTITION BY DEPARTMENT_ID
ORDER BY SALARY DESC ) SAL
FROM EMPLOYEES) T
WHERE T.SAL <= 3 ;