使用 MSSQL 中的附加 max() 条件从数据库中检索每个组中的最后一条记录

Ask*_*mov 2 sql sql-server sqlperformance

这是Retrieving last record in each group from database - SQL Server 2005/2008的后续问题

在答案中,此示例用于检索一组参数的最后一条记录(下面的示例检索计算机名中每个值的最后更新):

 select t.*
 from t
 where t.lastupdate = (select max(t2.lastupdate)
                  from t t2
                  where t2.computername = t.computername
                 );
Run Code Online (Sandbox Code Playgroud)

但是,在我的情况下,“lastupdate”不是唯一的(某些更新成批出现并且具有相同的 lastupdate 值,如果“computername”的两个更新出现在同一批次中,您将获得“computername + lastupdate”的非唯一输出”)。假设我还有一个字段“rowId”,它只是自动递增的。缓解措施是在查询中包含 max('rowId') 字段的另一个标准。

注意:虽然该示例使用特定于时间的名称“lastupdate”,但实际的选择标准可能与时间完全无关。

因此,我想问一下,根据“组定义参数”(在上述情况下为“计算机名”)和最大 rowId 选择每个组中最后一条记录的性能最高的查询是什么?

Gor*_*off 5

如果你没有唯一性,那就row_number()更简单了:

 select t.*
 from (select t.*,
              row_number() over (partition by computername order by lastupdate, rowid desc) as seqnum
       from t
      ) t
where seqnum = 1;
Run Code Online (Sandbox Code Playgroud)

使用正确的索引,相关子查询通常会更快。但是,性能差异并不是那么大。