如何使用SQL查询各部门中经验最少的员工姓名及所属部门?
解决每个部门经验最少员工的查询问题
你的原SQL逻辑存在错误——group by dept, name是按部门+姓名分组,每个分组对应单个员工,所以min(exp)其实就是该员工自己的经验值,完全没实现“找部门内经验最少员工”的需求。
下面给你几种可行的解法:
方法1:窗口函数(推荐,简洁高效)
用ROW_NUMBER()窗口函数给每个部门的员工按经验排序,直接筛选出经验最少的那一行:
SELECT name, department, experience FROM ( SELECT name, department, experience, ROW_NUMBER() OVER (PARTITION BY department ORDER BY experience ASC) AS rn FROM your_table ) t WHERE rn = 1;
- 注意:如果部门里有多个员工经验相同且都是最小值,这个方法只会返回其中一个;要是想保留所有并列的,把
ROW_NUMBER()换成RANK()或DENSE_RANK()就行。
方法2:子查询关联(兼容老版本SQL)
先查出每个部门的最小经验值,再和原表关联找到对应员工:
SELECT t.name, t.department, t.experience FROM your_table t JOIN ( SELECT department, MIN(experience) AS min_exp FROM your_table GROUP BY department ) dept_min ON t.department = dept_min.department AND t.experience = dept_min.min_exp;
- 这个方法会返回部门内所有经验等于最小值的员工,适合需要保留并列情况的场景。
方法3:NOT EXISTS 语句
通过判断当前员工的经验是部门内最小的(即同部门没有比他经验更少的人):
SELECT name, department, experience FROM your_table t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.department = t1.department AND t2.experience < t1.experience );
- 同样会返回所有部门内经验最少的员工,包括并列情况。
内容的提问来源于stack exchange,提问作者Shonima N Jacob
相关产品推荐
相关产品推荐

