SQL Server 2008 R2中按最新日期和唯一列获取表最新行
在SQL Server 2008 R2中,要基于最新日期和唯一列(比如你示例里的colOne)获取表的最新行,这里有几种实用的解决方案,结合你的表结构来详细说明:
方案1:使用ROW_NUMBER()窗口函数
这是最常用也最清晰的方法,通过窗口函数给每个分组内的行按日期排序,然后取排名第一的行。假设你要按colOne分组,获取每个组里colDate最新的记录:
WITH RankedRows AS ( SELECT colOne, colTwo, colThree, colDate, ROW_NUMBER() OVER (PARTITION BY colOne ORDER BY colDate DESC) AS RowRank FROM YourTableName ) SELECT colOne, colTwo, colThree, colDate FROM RankedRows WHERE RowRank = 1;
解释:
PARTITION BY colOne:按colOne将数据分组,每个组单独计算排名ORDER BY colDate DESC:在每个组内按日期倒序排列,最新的日期排第1- 最后筛选出
RowRank = 1的行,就是每个组的最新记录
方案2:使用关联子查询
如果不想用CTE(公用表表达式),可以用关联子查询来匹配每个分组的最大日期:
SELECT t1.colOne, t1.colTwo, t1.colThree, t1.colDate FROM YourTableName t1 INNER JOIN ( SELECT colOne, MAX(colDate) AS MaxDate FROM YourTableName GROUP BY colOne ) t2 ON t1.colOne = t2.colOne AND t1.colDate = t2.MaxDate;
解释:
- 子查询先找出每个
colOne对应的最大日期MaxDate - 然后将原表和子查询结果关联,匹配到每个分组中日期等于最大日期的行
注意:如果同一个colOne下有多个行的colDate完全相同且都是最新的,这个方法会返回所有这些行;而方案1只会返回其中一行(如果需要保留所有同日期的最新行,可以把ROW_NUMBER()换成RANK())。
方案3:使用TOP 1 WITH TIES 技巧
这是一个简洁的写法,适合需要获取所有分组最新行的场景:
SELECT TOP 1 WITH TIES colOne, colTwo, colThree, colDate FROM YourTableName ORDER BY ROW_NUMBER() OVER (PARTITION BY colOne ORDER BY colDate DESC);
解释:
TOP 1 WITH TIES会返回所有排名为1的行(当排序后的排名有并列第一时)- 这里的排序依据是每个分组内的日期倒序排名,所以最终得到每个分组的最新行
针对你的示例表,假设表名为YourTable,运行上述任意一种方案,都会返回colOne=0, colTwo=6, colThree=8, colDate='2014-05-13 00:00:00.000'这一行(如果后续还有更新的行,也会自动取最新的)。
内容的提问来源于stack exchange,提问作者cSharpDotNetGuy
相关产品推荐
相关产品推荐

