【发布时间】:2013-09-25 05:04:47
【问题描述】:
同样的老问题:
我有一张桌子。我想要一个字段的最大值行,按一组字段分组。但我不需要的只是最大值和按字段分组,我需要整行(所有其他字段,所以我不能这样做:
select max(field1), field2 from table group by field2;
正如我所说,我需要 field3, field4, ... , fieldn。
这个之前已经处理过了,我在这里找到了一个很好的答案:
SQL Select only rows with Max Value on a Column
基本上,它说我应该在原始表之间进行连接,从那里获取所有字段,以及一个子查询,让我获得最大值和按字段分组。在大多数情况下,这可能有效。
我的问题
对于我的特殊情况,由于涉及的数据类型,我不太确定该方法是否有效。举个例子吧。
考虑一下,这给了我想要的最大值,按我想要的字段分组:
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.field1 和 sq.f2 = mt.field2 可能不是要走的路(请参阅 What is the most effective way for float and double comparison?)。那么,在这方面对我有什么提示吗?
【问题讨论】:
-
我没有看到问题。使用
MAX()时不存在舍入问题。 -
当您比较可能略有不同舍入或累积错误的计算结果时,您只需要担心浮点比较。当您将表中的字段与其自身进行比较时,情况并非如此。
标签: mysql sql greatest-n-per-group