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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:02:27