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

SQL Server中使用ROW_NUMBER()分区时如何获取同最新日期的多条记录?

解决同一分组下提取所有最新日期记录的问题

你的问题出在使用了ROW_NUMBER()函数——它会给同一分组内的每条记录分配一个唯一的序号,哪怕这些记录的日期完全相同。所以当你筛选lastAnomaly = 1时,只能得到该分组下的一条记录,而不是所有同最新日期的记录。

要解决这个问题,你只需要把ROW_NUMBER()替换成RANK()或者DENSE_RANK()就可以了。这两个函数会给同一分组内具有相同排序值(这里是ins.Date DESC)的记录分配相同的排名,这样所有最新日期的记录都会得到排名1,筛选后就能全部保留。

修改后的查询语句如下:

SELECT * FROM (
 SELECT ins.ID, ins.UnitElement_ID, ins.Date, ue.Code,
 RANK() OVER (PARTITION BY ins.UnitElement_ID ORDER BY ins.Date DESC) AS lastAnomaly
 FROM Inspection ins
 INNER JOIN UnitElement ue ON ins.UnitElement_ID = ue.ID
 INNER JOIN InspectionedAnomaly ia ON ia.Inspection_ID = ins.ID
 WHERE ins.UnitElement_ID IN (3,10) AND ins.Evaluation IS NOT NULL
) selectedAnomaly
WHERE lastAnomaly = 1

补充说明:三个排名函数的差异

  • ROW_NUMBER():无论排序值是否相同,都会生成连续的唯一序号(比如1,2,3...)
  • RANK():相同排序值会得到相同排名,后续排名会跳过相同的数量(比如1,1,3...)
  • DENSE_RANK():相同排序值会得到相同排名,后续排名不会跳过(比如1,1,2...)

在你的场景中,RANK()和DENSE_RANK()都能满足需求,选择哪一个取决于你是否在意排名的连续性——不过对于筛选排名1的记录来说,两者效果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:23:01