[Oracle] 오라클 Rownum 이용한 Top-N 분석
< Top-N 분석 >
- 컬럼에서 가장 큰 n개의 값 또는 가장 작은 n개의 값을 요처하는 것이다.
- ex) 가장 적게 팔린 제품 10가지는 ? 회사의 최상위 소득자 3명은 ?
① 구조
SELECT [컬럼명,..], ROWNUM
FROM ( SELECT [컬럼명,..]
FROM table
ORDER BY TOP-N_column)
WHERE ROWNUM <= N;
- ROWNUM : 서브쿼리에서 반환되는 각 행에 1부터 시작하는 순차 값을 할당함
② 예제
- EMP 테이블에서 최상위 소득자 3명의 이름과 급여를 표시하시오.
SELECT ROWNUM as RANK, last_name, salary
FROM (select last_name, salary from employees order by salary DESC)
WHERE ROWNUM <= 3;
- EMP 테이블에서 최하위 소득자 3명의 이름과 급여를 표시하시오.
SELECT ROWNUM as RANK, last_name, salary
FROM (select last_name, salary from employees order by salary)
WHERE ROWNUM <= 3;
- EMPLOYEES 테이블에서 가장 예전에 입사한 사원 5명의 employee_id, last_name, salary, hire_date를 출력하시오.
SELECT employee_id, last_name, salary, hire_date
FROM (select employee_id, last_name, salary, hire_date from employees order by hire_date)
WHERE ROWNUM <= 5;
- EMPLOYEES 테이블에서 가장 최근에 입사한 사원 5명의 employee_id, last_name, salary, hire_date를 출력하시오.
SELECT employee_id, last_name, salary, hire_date
FROM (select employee_id, last_name, salary, hire_date from employees order by hire_date desc)
WHERE ROWNUM <= 5;
- (😵😵) EMPLOYEES 테이블과 DEPARTMENTS 테이블을 사용하여 최상위 소득자 순으로 10위에서 20위에 해당하는 사원들의 정보를 출력하시오.
SELECT *
FROM (SELECT rownum as rank, employee_id, last_name, salary, department_id, department_name
FROM (SELECT e.employee_id, e.last_name, e.salary, e,department_id, d.department_name
FROM employees e JOIN departments d
ON e.department_id=d.department_id
ORDER BY e.salary DESC)
WHERE rownum <= 20)
WHERE rank between 10 AND 20;
문제보자마자 금방 풀거라고 자만한 나 ... 공부를 좀 더 열심히 해야겠다 !
아래는 선생님 풀이
- 1위에서 20위 추출 > 10위에서 20위 추출 > 부서 테이블과 조인
- 부서 테이블과 조인 > 1위에서 20위 추출 > 10위에서 20위 추출도 가능하지만 성능 ↓
SELECT a.rank, a.employee_id, a.last_name, a.salary, a.department_id, b.department_name
FROM (SELECT rownum rank, employee_id, last_name, salary, department_id
FROM (SELECT employee_id, last_name, salary, department_id
FROM employees
ORDER BY salary DESC)
WHERE rownum <= 20) a JOIN departments b
ON (a.department_id = b.department_id)
WHERE a.rank BETWEEN 10 and 20;
- WHERE 조건절에서 RONUM은 작다 OR 작거나 같다 기호를 써야함
- 인라인뷰라서 ROWNUM이 1만 선언된 상태에서 시작한다. 3보다 작거나 같은 행을 출력하고 그 뒤인 ROWNUM 4는 조건을 만족하지 않기때문에 더이상 비교하지 않고 끝난다.
※ 만약에 WHERE절에 ROWNUM >= 3 이라면
- 1부터 False라서 저기서 더이상 진행되지 않아서 아무것도 출력을 하지않음