小编典典

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

sql

,提供了此示例以检索一组参数的最后一条记录(以下示例为计算机名中的每个值检索最新更新):

 select t.*
 from t
 where t.lastupdate = (select max(t2.lastupdate)
                  from t t2
                  where t2.computername = t.computername
                 );

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

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

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


阅读 168

收藏
2021-04-28

共1个答案

小编典典

如果您没有唯一性,那么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;

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

2021-04-28