当前位置: 首页 > 面试题库 >

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

陆文博
2023-03-14
问题内容

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

 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来选择每个组中的最后一条记录的 性能最高的 查询是什么?


问题答案:

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

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



 类似资料:
  • 问题内容: 有一个包含数据的表,如下所示: 如果我运行查询,我将得到的结果为: 什么查询将返回以下结果? 即,应返回每个组中的最后一条记录。 目前,这是我使用的查询: 但这看起来效率很低。还有其他方法可以达到相同的结果吗? 问题答案: MySQL 8.0现在支持窗口功能,就像几乎所有流行的SQL实现一样。使用这种标准语法,我们可以编写每组最多n个查询: 以下是我在2009年为此问题写的原始答案:

  • 问题内容: 我有一个包含足球比赛结果的MySQL数据库,并且只想检索该数据的特定子集。 数据由一个包含MatchDate,HomeTeam,AwayTeam,HomeGoals,AwayGoals的表组成 如何检索包含每个团队参与的最近6场比赛的数据的子集? 虽然我可以为单个团队执行此操作,但是如何获得一个包含表中每个团队的最后6个匹配项的子集?(我不担心该子集可能包含一些重复项)。 问题答案:

  • 问题内容: 如果我有一个具有以下结构和数据的表: 我将使用哪种查询来获得以下结果(随后的说明): 如你看到的: 每个仅返回一行。 最高的那一行是返回的那一行。 是否有一种 无需 使用子查询即可完成此操作的方法?该程序经过的关系代数术语中是否有名称? 问题答案: 该查询称为逐组最大值,它(至少在MySQL中)可以通过子查询实现。例如: 在sqlfiddle上看到它。

  • 问题内容: 有一个数据库,它在一个表中大约包含200万条记录。我从我的Java代码中运行查询,例如“ select * from table”。是否将从结果集中的数据库中获取完整数据。或不 。如果是,那么它将如何工作,我想学习此检索工作, 请让我知道,我在某处了解到它将从数据库中检索完整的数据并将其存储在临时存储中,并在输出中显示出来。还是与J2C有关 问题答案: 它会从结果集中的数据库中获取完整

  • 问题内容: 如标题所示,我想选择以分组的每组行的第一行和最后一行。 我在此表中包含以下数据: 我需要获取的是列开头的第一个值和列末尾的最后一个值,并按group by group列进行分组。 结果表应如下所示: 我使用和和进行了查询。它可以在SQL Server 2012中使用,但不能在SQL Server 2008中使用。我需要一个可以在SQL Server 2008中执行的查询。 问题答案:

  • 我有一个名为employee_comp_field的表,其中提供了薪资字段 然后,我有另一个表,其中员工工资数据存储emp_compensation每个字段。正如你所看到的emp_id 10有三套记录,因为他在同一年获得了三次加薪(year_id=101),这可以通过salary_order领域来识别。 我想用最大工资确定所有雇员的名单,我的期望输出如下: emp_id10号得到了三次加薪……所以