乍一看…
您只需要一个
GROUP BY带有
MAX聚合函数的子句:
SELECt id, MAX(rev)FROM YourTableGROUP 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.contentsFROM YourTable aINNER 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 aLEFT OUTER JOIN YourTable b ON a.id = b.id AND a.rev < b.revWHERe b.id IS NULL;
结论
两种方法都带来完全相同的结果。
如果您有两行使用
max-value-in-groupfor
group-identifier,则两种方法的结果都将出现在这两行中。
两种方法都与SQL ANSI兼容,因此,无论其“味道”如何,都将与您喜欢的RDBMS一起使用。
两种方法都对性能很友好,但是您的工作量可能会有所不同(RDBMS,数据库结构,索引等)。因此,当您选择一种方法而不是另一种方法时,请选择 基准
。并确保选择最有意义的一种。


![SQL仅选择列上具有最大值的行[重复] SQL仅选择列上具有最大值的行[重复]](http://www.mshxw.com/aiimages/31/366691.png)
