WITH tbl_ranking AS (
SELECT
RANK() OVER(partition by d.dept_no ORDER BY s.salary DESC) AS ranking,
CONCAT(e.first_name, ' ', e.last_name) AS name,
s.salary,
d2.dept_name
FROM
(
SELECT emp_no, MAX(salary) AS salary
FROM salaries
GROUP BY emp_no
) AS s
JOIN
employees AS e ON e.emp_no = s.emp_no
JOIN
dept_emp AS d ON e.emp_no = d.emp_no
JOIN
departments AS d2 ON d2.dept_no = d.dept_no
)
SELECT *
FROM tbl_ranking
WHERE ranking <= 3;
💡 RANK() 함수 - partition by 속성으로 그룹화, ORDER BY 속성으로 정렬하여 순위를 매길 수 있다.
부서별 그룹화, 연봉 높은 순 정렬한 순위로 가상 테이블을 만들고, 가상 테이블의 ranking 속성을 조건으로 3위까지 출력함