从dept、emp、sal三表提取浦那地区各部门最高薪员工
解决浦那地区各部门最高薪资员工提取问题
咱们先梳理下你当前SQL语句的问题:你把emp_id加入了GROUP BY子句,这会让结果按每个员工分组,而不是按部门分组,所以最终得到的是浦那地区所有员工的薪资(MAX(sal)其实就是员工自己的薪资),没法实现“每个部门最高薪员工”的需求。
下面给你两种靠谱的解决方案,都能输出你要的5行数据(对应浦那的5个部门),包含emp_id、dept、dept_id、salary字段:
方法1:子查询匹配部门最高薪资
先通过子查询算出浦那每个部门的最高薪资,再关联回员工表找到对应员工:
SELECT e.emp_id, d.dept, d.dept_id, s.salary FROM emp e JOIN sal s ON e.emp_id = s.emp_id JOIN dept d ON e.dept_id = d.dept_id WHERE d.loc = 'Pune' AND (e.dept_id, s.salary) IN ( -- 子查询:获取浦那各部门的最高薪资 SELECT dept_id, MAX(s2.salary) FROM emp e2 JOIN sal s2 ON e2.emp_id = s2.emp_id JOIN dept d2 ON e2.dept_id = d2.dept_id WHERE d2.loc = 'Pune' GROUP BY dept_id ) ORDER BY d.dept_id;
方法2:窗口函数(更简洁高效)
用RANK()窗口函数按部门分组、薪资降序排名,直接取排名第1的员工:
SELECT emp_id, dept, dept_id, salary FROM ( SELECT e.emp_id, d.dept, d.dept_id, s.salary, -- 按部门分组,薪资从高到低排名 RANK() OVER (PARTITION BY d.dept_id ORDER BY s.salary DESC) AS sal_rank FROM emp e JOIN sal s ON e.emp_id = s.emp_id JOIN dept d ON e.dept_id = d.dept_id WHERE d.loc = 'Pune' ) ranked_emps WHERE sal_rank = 1 -- 只取部门内薪资排名第1的员工 ORDER BY dept_id;
如果某个部门有多个员工薪资并列最高,RANK()会返回所有并列的员工;要是你只需要每个部门返回1个员工,可以把RANK()换成ROW_NUMBER()。
内容的提问来源于stack exchange,提问作者Movin Fernandes
相关产品推荐
相关产品推荐

