This question already has answers here:
Retrieving the last record in each group - MySQL
                                
                                    (27个答案)
                                
                        
                                在11个月前关闭。
            
                    
我有此表用于文档(此处为简化版):

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


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

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

更新资料
如答案所示,有一个SQL解决方案和here a sqlfiddle demo

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

最佳答案

第一眼看去...

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

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


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

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

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

实际上,是如此普遍以至于StackOverflow社区创建了一个标签来处理诸如greatest-n-per-group之类的问题。

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

与简单的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中。然后,有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-group表示group-identifier,则两种方法的结果都将出现在这两行中。

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

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

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

10-16 16:37