Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL仅选择重访列上具有最大值的行_Mysql_Sql_Greatest N Per Group - Fatal编程技术网

Mysql SQL仅选择重访列上具有最大值的行

Mysql SQL仅选择重访列上具有最大值的行,mysql,sql,greatest-n-per-group,Mysql,Sql,Greatest N Per Group,同样的老问题: 我有一张桌子。我想要一个字段的最大值行,按一组字段分组。但我不需要仅使用max value和groupby字段,我需要所有其他字段的整行,因此我不能只执行以下操作: select max(field1), field2 from table group by field2; 就像我说的,我需要第三,第四,菲尔登 这一点以前已经被处理过,我在这里找到了一个很好的答案: 基本上,它说我应该在原始表(从那里获取所有字段)和子查询(获取max和groupby字段)之间进行连接。在大

同样的老问题:

我有一张桌子。我想要一个字段的最大值行,按一组字段分组。但我不需要仅使用max value和groupby字段,我需要所有其他字段的整行,因此我不能只执行以下操作:

select max(field1),  field2 from table group by field2; 
就像我说的,我需要第三,第四,菲尔登

这一点以前已经被处理过,我在这里找到了一个很好的答案:

基本上,它说我应该在原始表(从那里获取所有字段)和子查询(获取max和groupby字段)之间进行连接。在大多数情况下,这可能是可行的

我的问题

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

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

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可能不是要看的方法。那么,这方面有什么提示吗?

您的查询很好:

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不会导致浮点舍入问题,但无论如何,您都不会使用该字段进行联接

仅供参考:如果您正在进行其他转换,或试图使用浮点数和小数点进行连接,则常用的方法是选择可接受的误差范围,并使用绝对值和减法:

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

我看不出有什么问题。使用MAX时没有舍入问题。在比较可能会稍微舍入不同或累积错误的计算结果时,只需担心浮点比较。当您将表中的字段与自身进行比较时,情况并非如此。事实上,数据类型FLOAT本身存在舍入问题,因此函数在具有FLOAT类型(如MAX或MIN)的数据上运行时也应该存在问题。请参阅…@RaymondNijland确实提到内部存储的值可能与查看的值不同,但它并没有说内部存储的值不一致。ie:我不应该指望将十进制数与看似相等的浮点数进行比较,但当只取MAX/MIN而不进行任何转换时,我可以指望float=float。没错,关于MIN和MAX,你是对的,就像手册上说的,你应该注意SUM和ABS等函数,或者如果你进行了转换+1对于ABSsq.maxf1-mt.field1<.0001编辑侧注意事项,如果索引不适用于此查询,则您可能还需要放大tmp_table_size和max_heap_table_size设置,如果这些设置太低,MySQL将创建基于磁盘的myisam表,这将破坏MySQL的性能。而且,如果索引不正确,GROUPBY将触发Using TEMPORATE,甚至内部联接中的派生嵌套select也可能触发临时表。看看这方面的文件