如何使用T-SQL筛选出表中具有最新datetime的行?
嘿,这个需求在T-SQL里有好几种实用的实现方式,我给你整理几个常用的,你可以根据你的表数据情况来选:
方法1:TOP 1 + ORDER BY(最直接的单行场景)
如果你的需求只是取一行最新时间的数据,这个写法最简单直观。假设你的表名叫YourTable,datetime类型的列是RecordTime,其他三列是ColA、ColB、ColC:
SELECT TOP 1 ColA, ColB, ColC, RecordTime FROM YourTable ORDER BY RecordTime DESC;
注意:如果有多个行的RecordTime是完全相同的最新值,这个方法只会返回其中随机的一行。
方法2:窗口函数(取所有同最新时间的行)
如果你的表可能存在多行共享同一个最新datetime值,而且你想把这些行都捞出来,用窗口函数RANK()或者ROW_NUMBER()就很合适:
WITH RankedRecords AS ( SELECT ColA, ColB, ColC, RecordTime, -- RANK()会给相同时间的行分配相同排名 RANK() OVER (ORDER BY RecordTime DESC) AS TimeRank FROM YourTable ) SELECT ColA, ColB, ColC, RecordTime FROM RankedRecords WHERE TimeRank = 1;
要是你还是只想取一行(哪怕有多个同时间的),把RANK()换成ROW_NUMBER()就行,它会给同时间的行分配不同的序号,筛选RowNum = 1就只会拿一行。
方法3:MAX()子查询(经典关联写法)
另一种经典思路是先找到表中最大的datetime值,再用这个值去匹配原表的行:
SELECT ColA, ColB, ColC, RecordTime FROM YourTable WHERE RecordTime = (SELECT MAX(RecordTime) FROM YourTable);
这个写法和用RANK()的效果一样,能取出所有时间等于最大值的行,逻辑也很好理解。
小提示
如果你的表数据量很大,记得给RecordTime列加个索引,不管用上面哪种写法,查询性能都会提升很多,尤其是排序和求最大值的操作会快不少。
内容的提问来源于stack exchange,提问作者Doe
相关产品推荐
相关产品推荐

