This question already has answers here:
Retrieving the last record in each group - MySQL
(27个答案)
在11个月前关闭。
我有此表用于文档(此处为简化版):
如何为每个ID选择一行并且仅选择最大转速?
使用上述数据,结果应包含两行:
目前,我在
更新资料
如答案所示,有一个SQL解决方案和here a sqlfiddle demo。
更新2
在添加上述sqlfiddle之后,我注意到问题被投票的速率已经超过答案的投票率。那不是意图!小提琴基于答案,尤其是已接受的答案。
从来没有那么简单,是吗?
我刚刚注意到您也需要
在SQL中,这是一个非常常见的问题:查找行的整个数据,并在每个组标识符的列中找到某个最大值。我在职业生涯中听到了很多。实际上,这是我在当前工作的技术面试中回答的问题之一。
实际上,是如此普遍以至于StackOverflow社区创建了一个标签来处理诸如greatest-n-per-group之类的问题。
基本上,您有两种方法可以解决该问题:
与简单的
用这种方法,您首先在子查询中找到
自我左联接,调整联接条件和过滤器
在这种方法中,您将表与其自身保持连接。平等在
第二个连接条件是左侧值小于右侧值
当您执行第1步时,实际具有最大值的行将在右侧具有
因此,您最终得到:
结论
两种方法都带来完全相同的结果。
如果您有两行,其中
两种方法都与SQL ANSI兼容,因此,无论其“味道”如何,均可与您喜欢的RDBMS一起使用。
两种方法也都是性能友好的,但是您的工作量可能会有所不同(RDBMS,数据库结构,索引等)。因此,当您选择一种方法而不是另一种方法时,便是基准测试。并确保选择最适合您的一种。
(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-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步时,实际具有最大值的行将在右侧具有
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