You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL分组查询:按部门和员工分组,获取每个员工的最高薪资记录

正确获取员工最高薪资对应记录的SQL查询

问题背景

现有Employees表,包含emp_name、dept_name、year、salary四列,原始数据如下:

emp_namedept_nameyearsalary
Nicksales202020000
Petermanager202030000
Nicksales202122000
Petermanager202135000
Samsales202225000
Davidmanager202240000

需求:查询每个员工的最高薪资对应的完整记录(包含所有字段)。

原查询的问题

你尝试的SQL语句:

select emp_name, dept_name, salary from Employees
group by dept_name, emp_name, salary
having max(salary);

返回所有记录的原因:

  1. GROUP BY中包含了salary,这会让每个不同的薪资值单独成为一个分组,无法实现按员工聚合最高薪资的效果;
  2. 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_namedept_nameyearsalary
Nicksales202122000
Samsales202225000
Petermanager202135000
Davidmanager202240000

内容的提问来源于stack exchange,提问作者user20534765

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:50:49