더북(TheBook)

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등급으로 나눕니다.

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