代码之家  ›  专栏  ›  技术社区  ›  onkami

使用mssql中的其他max()条件从数据库中检索每个组中的最后一条记录

  •  1
  • onkami  · 技术社区  · 6 年前

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

    在答案中,提供此示例是为了检索一组参数的最后一条记录(下面的示例检索ComputerName中每个值的最后更新):

     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”,但实际的选择条件可能与时间根本不相关。

    因此,我想问,什么是 性能最佳 基于“组定义参数”(在上面的例子中为“computername”)和最大rowid选择每个组中最后一条记录的查询?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Gordon Linoff    6 年前

    如果你没有独特性,那么 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;
    

    如果索引正确,相关子查询通常更快。但是,性能差异并不是很大。