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

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