如何使用T-SQL获取每位员工指定月份的最后30条评估记录?
解决方案:获取每位员工当月最多30条最新评估记录
没问题,这个需求用T-SQL的窗口函数就能轻松实现!我帮你整理了具体的实现方案:
核心实现代码
WITH RankedEvaluations AS ( SELECT Date, Month, Team, Employee_ID, Evaluation_Score, Evaluation_Case_Number, -- 按员工分组,每组内按日期倒序给记录编号(最新的排第1) ROW_NUMBER() OVER (PARTITION BY Employee_ID ORDER BY Date DESC) AS RecordRank FROM X WHERE Month = @month ) SELECT Date, Month, Team, Employee_ID, Evaluation_Score, Evaluation_Case_Number FROM RankedEvaluations WHERE RecordRank <= 30 -- 最终按员工ID+日期倒序展示,方便查看每个员工的最新记录 ORDER BY Employee_ID, Date DESC;
代码逻辑说明
PARTITION BY Employee_ID:把整个数据集按员工ID拆分,每个员工的记录单独形成一个分组,确保排名是针对每个员工独立计算的ORDER BY Date DESC:在每个员工的分组内,按评估日期从新到旧排序,最新的记录会被标记为RecordRank = 1- 外层查询筛选
RecordRank <= 30:自动保留每个员工最多30条最新记录,如果当月该员工的评估记录不足30条,所有记录都会被完整返回
可选优化:处理同一天的多条记录
如果存在同一员工在同一天有多条评估记录的场景,你可以给排序条件加上Evaluation_Case_Number DESC,确保同一天的记录按案例编号从大到小排序(避免系统随机编号):
ROW_NUMBER() OVER (PARTITION BY Employee_ID ORDER BY Date DESC, Evaluation_Case_Number DESC) AS RecordRank
内容的提问来源于stack exchange,提问作者NewbieSQL_Germany
相关产品推荐
相关产品推荐

