同样的老问题:
我有一张桌子。我想要一个字段具有最大值的行,按一组字段分组。但我不需要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.field1
和sq.f2 = mt.field2
可能不是最佳选择(请参阅What is the most effective way for float and double comparison?)。那么,对我来说有什么暗示吗?
答案 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