3 정답
WITH basis AS
(SELECT dept_name, emp_no, first_name, last_name, salary,
RANK() OVER (PARTITION BY dept_name
ORDER BY salary DESC) ranks
FROM dept_emp_sal_v
),
top10 AS
(SELECT *
FROM basis
WHERE ranks <= 10
)
SELECT dept_name, emp_no, first_name, last_name, salary,
NTILE(3) OVER (PARTITION BY dept_name
ORDER BY salary DESC) grade
FROM top10
ORDER BY 1, 6;
실행결과
해설 문제 2번과 같이 basis라는 CTE 서브쿼리를 만들고, basis를 다시 조회해 순위가 10위 이하인 건을 조회하는 top10이란 CTE 서브쿼리를 하나 더 작성합니다. 그리고 메인쿼리에서 top10 CTE를 조회하는데, 3등급으로 구분해야 하므로 NTILE() 함수의 매개변수로 3을 입력해 부서별 상위 10명을 1, 2, 3등급으로 나눕니다.