gpt4 book ai didi

mysql - SQL仅选择列上具有最大值的行

转载 作者:IT老高 更新时间:2023-10-28 12:47:17 26 4
gpt4 key购买 nike

我有这张文件表(这里是简化版):

<头>
身份证 内容
1 1 ...
2 1 ...
1 2 ...
1 3 ...

如何为每个 id 选择一行并且只选择最大的 rev?
使用上述数据,结果应该包含两行:[1, 3, ...][2, 1, ..]。我正在使用 MySQL

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

最佳答案

乍一看...

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

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

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

我刚刚注意到您还需要 content 列。

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

实际上,Stack Overflow 社区创建了一个标签来处理此类问题非常普遍: .

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

加入简单的group-identifier, max-value-in-group子查询

在这种方法中,您首先在子查询中找到 group-identifier, max-value-in-group(上面已经解决)。然后你将你的表加入到子查询中,group-identifiermax-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 中有平等。然后,两个聪明的 Action :

  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;

结论

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

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

这两种方法都与 SQL ANSI 兼容,因此,无论其“风格”如何,都可以与您最喜欢的 RDBMS 一起使用。

这两种方法对性能也很友好,但是您的使用范围可能会有所不同(RDBMS、数据库结构、索引等)。因此,当您选择一种方法而不是另一种方法时,基准测试。并确保您选择对您最有意义的那个。

关于mysql - SQL仅选择列上具有最大值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7745609/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com