SQL分组查询:按部门和员工分组,获取每个员工的最高薪资记录
正确获取员工最高薪资对应记录的SQL查询
问题背景
现有Employees表,包含emp_name、dept_name、year、salary四列,原始数据如下:
| emp_name | dept_name | year | salary |
|---|---|---|---|
| Nick | sales | 2020 | 20000 |
| Peter | manager | 2020 | 30000 |
| Nick | sales | 2021 | 22000 |
| Peter | manager | 2021 | 35000 |
| Sam | sales | 2022 | 25000 |
| David | manager | 2022 | 40000 |
需求:查询每个员工的最高薪资对应的完整记录(包含所有字段)。
原查询的问题
你尝试的SQL语句:
select emp_name, dept_name, salary from Employees group by dept_name, emp_name, salary having max(salary);
返回所有记录的原因:
GROUP BY中包含了salary,这会让每个不同的薪资值单独成为一个分组,无法实现按员工聚合最高薪资的效果;HAVING MAX(salary)逻辑无效——每个分组只有一条薪资记录,MAX(salary)就是该记录的薪资值,非零值都会被保留,所以所有记录都被返回。
正确的SQL查询方法
方法1:使用窗口函数(推荐)
用ROW_NUMBER()窗口函数可以精准筛选每个员工的最高薪资记录:
SELECT emp_name, dept_name, year, salary FROM ( SELECT emp_name, dept_name, year, salary, -- 按员工分组,薪资降序排序,最高薪资的记录标记为1 ROW_NUMBER() OVER (PARTITION BY emp_name ORDER BY salary DESC) AS row_num FROM Employees ) ranked_emps WHERE row_num = 1;
如果存在同一员工有多条薪资相同的最高记录(比如同一年薪资重复),可以替换ROW_NUMBER()为RANK(),这样会返回所有并列最高的记录:
SELECT emp_name, dept_name, year, salary FROM ( SELECT emp_name, dept_name, year, salary, RANK() OVER (PARTITION BY emp_name ORDER BY salary DESC) AS rank_num FROM Employees ) ranked_emps WHERE rank_num = 1;
方法2:关联子查询
通过子查询获取每个员工的最高薪资,再关联原表筛选对应记录:
SELECT e.emp_name, e.dept_name, e.year, e.salary FROM Employees e WHERE e.salary = ( SELECT MAX(salary) FROM Employees WHERE emp_name = e.emp_name );
预期输出
执行上述正确语句后,会得到以下结果:
| emp_name | dept_name | year | salary |
|---|---|---|---|
| Nick | sales | 2021 | 22000 |
| Sam | sales | 2022 | 25000 |
| Peter | manager | 2021 | 35000 |
| David | manager | 2022 | 40000 |
内容的提问来源于stack exchange,提问作者user20534765
相关产品推荐
相关产品推荐

