如何编写SQL查询在每条记录中显示对应部门的最高薪资?
如何在SQL查询中为每条记录添加对应部门的最高薪资列
我有如下员工表:
| Empid | Empname | dept | salary |
|---|---|---|---|
| 1 | abc | 100 | 1000 |
| 2 | def | 100 | 2000 |
| 3 | ghi | 200 | 500 |
| 4 | jkl | 200 | 700 |
| 5 | mno | 200 | 800 |
希望通过SQL查询得到如下结果集,在每条记录中新增对应部门的最高薪资列dept_maxsal:
| Empid | Empname | dept | salary | dept_maxsal |
|---|---|---|---|---|
| 1 | abc | 100 | 1000 | 2000 |
| 2 | def | 100 | 2000 | 2000 |
| 3 | ghi | 200 | 500 | 800 |
| 4 | jkl | 200 | 700 | 800 |
| 5 | mno | 200 | 800 | 800 |
解决方案
方法一:使用窗口函数(推荐)
大多数现代SQL数据库(MySQL 8.0+、PostgreSQL、SQL Server、Oracle等)都支持窗口函数,这是最简洁高效的实现方式:
SELECT Empid, Empname, dept, salary, MAX(salary) OVER (PARTITION BY dept) AS dept_maxsal FROM employees;
逻辑说明:PARTITION BY dept将数据按部门分组,MAX(salary)计算每组内的最高薪资,OVER子句确保该值被映射到对应部门的每一条记录上。
方法二:使用子查询关联(兼容旧版数据库)
如果你的数据库不支持窗口函数(如MySQL 5.x及以下),可以用子查询先计算各部门最高薪资,再关联原表:
SELECT e.Empid, e.Empname, e.dept, e.salary, d.dept_maxsal FROM employees e JOIN (SELECT dept, MAX(salary) AS dept_maxsal FROM employees GROUP BY dept) d ON e.dept = d.dept;
逻辑说明:子查询先按部门分组得到各部门的最高薪资临时表,再通过dept字段将临时表与原员工表关联,把最高薪资字段追加到每条记录中。
内容的提问来源于stack exchange,提问作者Karthika
相关产品推荐
相关产品推荐

