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

SQL仅选择列上具有最大值的行[重复]

白烨煜
2023-03-14
问题内容

想要改善这篇文章吗? 提供此问题的详细答案,包括引文和为什么答案正确的解释。答案不够详细的答案可能会被编辑或删除。

这个问题已经在这里有了答案

检索每个组中的最后一个记录-MySQL (27个答案)

去年关闭。

我有此表用于文档(此处为简化版):

+------+-------+--------------------------------------+
| id   | rev   | content                              |
+------+-------+--------------------------------------+
| 1    | 1     | ...                                  |
| 2    | 1     | ...                                  |
| 1    | 2     | ...                                  |
| 1    | 3     | ...                                  |
+------+-------+--------------------------------------+

如何为每个ID选择一行,而仅选择最大转速?
根据上述数据,结果应包含两行:[1, 3, ...][2, 1, ..]。我正在使用 MySQL

目前,我在while循环中使用检查来检测和覆盖结果集中的旧版本。但这是获得结果的唯一方法吗?没有 SQL 解决方案吗?

更新
作为答案提示,有 一个SQL的解决方案,并且这里sqlfiddle演示。

更新2
我在添加上面的 sqlfiddle 之后注意到,问题被投票的速率已经超过答案的投票率。那不是意图!小提琴基于答案,尤其是已接受的答案。


问题答案:

乍一看…

您只需要一个GROUP BY带有MAX聚合函数的子句:

SELECT id, MAX(rev)
FROM YourTable
GROUP BY id

从来没有那么简单,是吗?

我只是注意到您也需要该content专栏。

在SQL中,这是一个非常常见的问题:查找行的整个数据,并在每个组标识符的列中找到某个最大值。我在职业生涯中听到了很多。实际上,这是我在当前工作的技术面试中回答的问题之一。

实际上,是如此普遍,以至于StackOverflow社区创建了一个标签来处理这样的问题:great-n-per-
group

基本上,有两种方法可以解决该问题:

结合简单的group-identifier, max-value-in-group子查询

用这种方法,您首先group-identifier, max-value-in- group在子查询中找到了(已经在上面解决了)。然后,您将表连接到子查询,group-identifier并且在和上具有相等性max-value- in-group

SELECT a.id, a.rev, a.contents
FROM YourTable a
INNER JOIN (
    SELECT id, MAX(rev) rev
    FROM YourTable
    GROUP BY id
) b ON a.id = b.id AND a.rev = b.rev

自我左联接,调整联接条件和过滤器

在这种方法中,您无需将表本身连接起来。平等是必不可少的group-identifier。然后,有2个明智的举动:

  1. 第二个连接条件是左侧值小于右侧值
  2. 当您执行步骤1时,实际具有最大值的行将NULL在右侧(它是LEFT JOIN,还记得吗?)。然后,我们过滤联接的结果,仅显示右侧为的行NULL

因此,您最终得到:

SELECT a.*
FROM YourTable a
LEFT OUTER JOIN YourTable b
    ON a.id = b.id AND a.rev < b.rev
WHERE b.id IS NULL;

结论

两种方法都带来完全相同的结果。

如果您有两行使用max-value-in-groupfor group-identifier,则两种方法的结果都将出现在这两行中。

两种方法都与SQL ANSI兼容,因此,无论其“味道”如何,都将与您喜欢的RDBMS一起使用。

两种方法都对性能很友好,但是您的工作量可能会有所不同(RDBMS,数据库结构,索引等)。因此,当您选择一种方法而不是另一种方法时,请选择 基准
。并确保选择最有意义的一种。



 类似资料:
  • 问题内容: 这是我的表结构: 我需要它仅返回这些行 意思是我只想要每个文件具有最新版本的功能。 我不想要下面的结果,即不是最新版本的唯一函数ID 我看过如何通过SQL中的另一列来选择具有MAX(列值),DISTINCT的行?,但会返回最新的唯一函数ID。 该查询必须与sqlite3兼容。 问题答案: 一种有效的方法通常是使用: 此查询可以利用上的索引。 这将查询重新表述为:“从表中获取其中相应文件

  • 我有一个表格结构 如何使用条件?我尝试使用这个,但结果是

  • 问题内容: 我已经看到了很多解决此类问题的解决方案尤其是此SQL仅选择在Column上具有Max Value的行,但是似乎没有一个合适的解决方案: 我有以下表格布局,即附件的版本控制,这些附件绑定到实体: 输出应该是最大版本号,按group_id和Entity_id分组,如果有帮助,我只需要一个单个entity_id的列表即可: 我想出的是这种自我加入: 但是,只有在不同的实体不共享相同的组号的情

  • 问题内容: 这应该是一个简单的问题,但我无法使其起作用:( 如何按另一列分组选择具有最大列值的行? 例如, 我有以下表格定义: 现在的问题是,我想先按结果分组,然后再从每组中选择一行,具体取决于哪一组具有最高的。 我试过了 但是,与其以正确的方式回报我,不如以同一个小组中最早的回报我。 有任何想法吗? 问题答案: 我本人为此进行了很多次努力,解决方案是以不同的方式考虑您的查询。 我希望其中具有该D

  • 问题内容: 假设我们在Django中有一个定义如下的模型: 名称字段不是唯一的,因此可以具有重复的值。我需要完成以下任务:从模型中选择具有至少一个name字段重复值的所有行。 我知道如何使用普通的SQL来做到这一点(可能不是最好的解决方案): 因此,可以使用django ORM选择它吗?还是更好的SQL解决方案? 问题答案: 尝试: 这与使用Django所获得的效果非常接近。问题在于这将返回一个w

  • 问题内容: 我试图一次从一张桌子上得到2行。上周的最小日期时间(今天-7)和最晚的日期(今天)的一个。 我的桌子: 我可以通过以下方式选择上周的数据: 但我只想要第1行和第125行,因为这些是用于计算的行。所以我的问题是: 如何从上一个查询的结果中选择2行(带有MIN和MAX日期)? 问题答案: 您可以使用此: 编辑: 由于两台计算机完全有可能具有相同的值,因此应更新查询以在子句中也包含过滤器。我