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

如何在SQL Server中获取每位员工的最新RateModifiedDate记录

需求说明

我在SQL Server中有如下数据表:

DepartmentIDDepartmentEmployeeIDRateRateModifiedDate
16Executive23439.06002009-01-31 00:00:00.000
16Executive23448.55772011-11-14 00:00:00.000
16Executive23460.09622012-01-29 00:00:00.000
16Executive1125.50002009-01-14 00:00:00.000

希望获取每位员工对应的最新RateModifiedDate记录,预期结果如下:

DepartmentIDDepartmentEmployeeIDRateRateModifiedDate
16Executive23460.09622012-01-29 00:00:00.000
16Executive1125.50002009-01-14 00:00:00.000

解法1:使用ROW_NUMBER()窗口函数

这是SQL Server中处理此类分组取最新记录场景的标准方案,逻辑清晰且扩展性强:

SELECT DepartmentID, Department, EmployeeID, Rate, RateModifiedDate
FROM (
    SELECT 
        *,
        ROW_NUMBER() OVER(PARTITION BY EmployeeID ORDER BY RateModifiedDate DESC) AS rn
    FROM YourTableName
) t
WHERE rn = 1;
  • PARTITION BY EmployeeID:按员工ID分组,每组独立计算行号
  • ORDER BY RateModifiedDate DESC:每组内按修改日期降序排列,最新记录的行号为1
  • 外层筛选行号等于1的记录,即可得到每位员工的最新薪资记录

解法2:使用MAX()子查询关联

适用于不支持窗口函数的低版本SQL Server:

SELECT t1.*
FROM YourTableName t1
INNER JOIN (
    SELECT EmployeeID, MAX(RateModifiedDate) AS LatestDate
    FROM YourTableName
    GROUP BY EmployeeID
) t2 ON t1.EmployeeID = t2.EmployeeID AND t1.RateModifiedDate = t2.LatestDate;

注意:如果同一员工在同一日期有多条薪资记录,此方法会返回所有符合条件的记录;若需唯一结果,可结合其他字段进一步筛选

解法3:使用TOP 1 WITH TIES(SQL Server 2005+)

更简洁的写法,利用WITH TIES返回所有排序后并列第一的记录:

SELECT TOP 1 WITH TIES
    DepartmentID, Department, EmployeeID, Rate, RateModifiedDate
FROM YourTableName
ORDER BY ROW_NUMBER() OVER(PARTITION BY EmployeeID ORDER BY RateModifiedDate DESC);

本质与解法1逻辑一致,只是将窗口函数移至ORDER BY子句中,通过TOP 1 WITH TIES直接获取所有行号为1的记录

内容的提问来源于stack exchange,提问作者Edwin Iraheta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 15:10:29