더북(TheBook)

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위까지 명단을 조회할 수 있습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.