如何编写SQL查询获取每月薪资最高的员工姓名和对应薪资
正确查询实现
原有直接按month分组取id和max(salary)的写法存在逻辑缺陷:返回的id不保证是对应最高薪资的员工id,无法直接关联员工表得到正确姓名。下面给出两种可行方案:
方案1:窗口函数实现(支持SQL8.0及以上版本,写法简洁)
SELECT e.name, t.salary FROM ( SELECT id, salary, RANK() OVER(PARTITION BY month ORDER BY salary DESC) AS rk FROM salary_data ) t JOIN emp_data e ON t.id = e.id WHERE t.rk = 1;
说明:用RANK()窗口函数给每个月份的薪资做降序排名,取排名为1的记录即为当月最高薪资的员工,再关联emp_data表即可拿到对应姓名。如果某月份存在多个员工薪资同为最高的情况,所有符合条件的员工都会被返回。
方案2:子查询匹配实现(兼容所有SQL版本)
SELECT e.name, s.salary FROM salary_data s JOIN emp_data e ON s.id = e.id JOIN ( SELECT month, MAX(salary) AS max_sal FROM salary_data GROUP BY month ) m ON s.month = m.month AND s.salary = m.max_sal;
说明:先通过子查询计算出每个月的最高薪资值,再关联回薪资表匹配到所有拿到该薪资的员工,最后关联员工表拿到姓名。
测试返回结果
基于你提供的测试数据,执行后输出结果如下:
| name | salary |
|---|---|
| RAMESH | 50000 |
| RAJEEV | 51000 |
| RAJEEV | 72000 |
| RAMESH | 49000 |
内容的提问来源于stack exchange,提问作者Shubham Londhe
相关产品推荐
相关产品推荐

