gpt4 book ai didi

mysql - SQL 仅选择重新访问列上具有最大值的行

转载 作者:可可西里 更新时间:2023-11-01 08:33:43 27 4
gpt4 key购买 nike

同样的老问题:

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

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.field1sq.f2 = mt.field2 可能不是要走的路(见 What is the most effective way for float and double comparison? )。那么,在这方面对我有什么提示吗?

最佳答案

您的查询没问题:

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() 不会导致 float 舍入问题,如果您正在聚合或执行其他会引起关注的计算,那么您就不会无论如何都要使用该字段来 JOIN

仅供引用:如果您正在做一些其他转换或尝试 JOIN 在一侧使用 FLOAT 并在另一侧使用 DECIMAL方法是选择可接受的误差范围并使用绝对值和减法:

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 ABS(sq.maxf1 - mt.field1) < .0001
AND sq.f2 = mt.field2

关于mysql - SQL 仅选择重新访问列上具有最大值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18990726/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com