2 정답
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
)
SELECT *
FROM basis
WHERE ranks <= 3
ORDER BY 1, 6;
실행결과
해설 CTE로 basis라는 서브쿼리를 작성합니다. 서브쿼리에서는 dept_emp_sal_v 뷰를 조회하면서 RANK() 함수로 부서별 급여가 많은 순서대로 순위를 구하는 ranks라는 가상 칼럼을 추가합니다. RANK() 함수의 PARTITION BY 절에는 부서명인 dept_name, ORDER BY 절에는 salary DESC를 기술합니다. 이렇게 하면 부서별로 급여가 많은 순서대로 1, 2, 3...처럼 순위가 부여됩니다. 마지막으로 메인쿼리에서 basis라는 CTE 서브쿼리를 참조하는데, WHERE 절 조건에 ranks 값이 3보다 작거나 같다는 조건을 주면 부서별로 급여가 많은 순서대로 1~3위까지 명단을 조회할 수 있습니다.