如何从员工表与薪资表查询所有员工的最新月度薪资数据?
获取员工最新月度薪资的SQL解决方案
没问题,我来帮你搞定这个需求!要获取每个员工的最新月度薪资(也就是你数据里的3月薪资),这里有两种实用的SQL写法,都能完美解决你的问题:
方法一:子查询筛选每个员工的最大月份
这种方法先通过子查询找到每个员工对应的最晚薪资月份,再关联两张表拿到对应薪资:
SELECT e.emp_id, e.emp_name, s.salary FROM `Employee-Table` e JOIN `Salary-Table` s ON e.emp_id = s.emp_id WHERE s.month = ( SELECT MAX(month) FROM `Salary-Table` WHERE emp_id = e.emp_id );
逻辑说明:
- 子查询
SELECT MAX(month) FROM Salary-Table WHERE emp_id = e.emp_id会单独找出每个员工的最新薪资月份 - 外层查询通过员工ID关联两张表,只保留对应最新月份的薪资记录
- 因为你的数据里所有员工的最新月份都是3月,所以最终结果就是所有员工的3月薪资
方法二:用窗口函数ROW_NUMBER()标记最新记录
如果后续你的薪资数据会不断更新,这种方法更灵活,不需要修改查询逻辑就能自动获取最新薪资:
SELECT emp_id, emp_name, salary FROM ( SELECT e.emp_id, e.emp_name, s.salary, ROW_NUMBER() OVER (PARTITION BY e.emp_id ORDER BY s.month DESC) AS rn FROM `Employee-Table` e JOIN `Salary-Table` s ON e.emp_id = s.emp_id ) t WHERE rn = 1;
逻辑说明:
- 内层查询用
ROW_NUMBER()函数,按员工ID分组(PARTITION BY e.emp_id),再按月份倒序排序(ORDER BY s.month DESC),给每个员工的薪资记录编号,最新的月份会被标记为rn=1 - 外层查询只筛选出编号为1的记录,也就是每个员工的最新薪资
小提示:
如果你的month字段是字符串类型,要确保数据库能正确识别它的日期排序(比如你用的"1st jan 2018"格式,大部分数据库可以自动解析,但更推荐把月份字段存储为日期类型,这样排序和筛选会更准确哦)
内容的提问来源于stack exchange,提问作者SR Depp
相关产品推荐
相关产品推荐

