SQL仅重新选择列上具有“最大值”的行

时间:2013-09-24 19:48:47

标签: mysql sql greatest-n-per-group

同样的老问题:

我有一张桌子。我想要一个字段具有最大值的行,按一组字段分组。但我不需要JUST最大值和分组字段,我需要完整的行(所有其他字段,所以我不能这样做:

select max(field1),  field2 from table group by field2; 

正如我所说,我需要field3,field4,...,fieldn。

此前已经过治疗,我在这里找到了一个很好的答案:

SQL Select only rows with Max Value on a Column

基本上,它说我应该在原始表之间进行连接,从那里获取所有字段,以及一个子查询,它使我获得max和group by字段。对于大多数情况,这可能有效。

我的问题

对于我的特定情况,由于涉及的数据类型,我不太确定该方法是否有效。让我举个例子。

考虑到这给了我想要的最大值,按我想要的字段分组:

select max(field1) maxf1, field2 f2 from mytable group by f2

以上链接建议尝试类似:

SELECT mt.field1, mt.field2, mt.field3, ... , mt.fieldn
FROM mytable mt
INNER JOIN (
    SELECT max(field1) maxf1, field2 f2 FROM mytable GROUP BY f2
) sq
ON sq.maxf1 = mt.field1 AND sq.f2 = mt.field2

对于我的特定情况,field1和field2可以是FLOAT和TIMESTAMP类型。因此,联接比较sq.maxf1 = mt.field1sq.f2 = mt.field2可能不是最佳选择(请参阅What is the most effective way for float and double comparison?)。那么,对我来说有什么暗示吗?

1 个答案:

答案 0 :(得分:2)

您的查询很好:

SELECT mt.field1, mt.field2, mt.field3, ... , mt.fieldn
FROM mytable mt
INNER JOIN ( SELECT max(field1) maxf1, field2 f2 
             FROM mytable GROUP BY f2
           ) sq
   ON sq.maxf1 = mt.field1 
     AND sq.f2 = mt.field2

MAX()MIN()不会导致浮动舍入问题,如果您正在聚合或执行其他可能会引起关注的计算,但是您不会将该字段用于{{1无论如何。

仅供参考:如果您正在进行其他转换或尝试JOIN一方使用JOIN而另一方使用FLOAT,则常用方法是选择可接受的误差范围使用绝对值和减法:

DECIMAL