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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:54:06