这是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
);
然而,就我而言," lastupdate"并不是唯一的(有些更新是分批进行的,并且具有相同的lastupdate值,如果" computername&#34的两次更新都在同一批次中,您将获得" computername + lastupdate&#的非唯一输出34)。 假设我也有字段" rowId"这只是自动增量。缓解措施是在查询中包含max(' rowId')字段的另一个标准。
注意:虽然该示例使用特定于时间的名称" lastupdate",但实际的选择标准可能与时间无关。
因此,我想问一下,根据"组定义参数"选择每个组中最后一条记录的性能最高的查询是什么? (在上面的例子中," computername")和最大的rowId?
答案 0 :(得分:2)
如果您没有唯一性,那么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;
使用正确的索引,相关子查询通常更快。但是,性能差异并不是很大。