MySQL - Max()返回错误的结果

时间:2010-11-09 02:31:57

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

我在MySQL服务器上尝试了这个查询(5.1.41)...

SELECT max(volume), dateofclose, symbol, volume, close, market FROM daily group by market

我得到了这个结果:

max(volume) dateofclose symbol  volume  close   market
287031500     2010-07-20  AA.P    500     66.41   AMEX
242233000     2010-07-20  AACC    16200   3.98    NASDAQ
1073538000   2010-07-20  A       4361000 27.52   NYSE
2147483647   2010-07-20  AAAE.OB 400     0.01    OTCBB
437462400     2010-07-20  AAB.TO  31400   0.37    TSX
61106320       2010-07-20  AA.V    0       0.24    TSXV

如您所见,最大音量与音量列的“实际”值非常不同?!?

volume列被定义为int(11),我在这个表中有200万行,但它离MyISAM存储的最大值很远,所以我不相信这是问题!?同样奇怪的是数据从同一天开始显示(dateofclose)。如果我使用WHERE子句强制特定日期,则相同的符号会出现不同的max(volume)结果。这很奇怪......

在这需要一些帮助!

更新:

这是我编辑过的“工作”请求:

SELECT a.* FROM daily a 
INNER JOIN ( 
SELECT market, MAX(volume) AS max_volume 
FROM daily 
WHERE dateofclose = '20101108' 
GROUP BY market 
) b ON 
a.market = b.market AND 
a.volume = b.max_volume

所以这给了我市场上最高交易量的股票(2010年11月8日)。

3 个答案:

答案 0 :(得分:7)

  

如您所见,最大音量与音量列的“实际”值非常不同?!?

这是因为MySQL相当奇怪,并不是GROUP一种感性的方式。

选择MAX(column)会获得该列的最大值,但选择其他列(或column本身)将不一定选择找到的整行{ {1}}值是。你基本上得到一个任意的(通常是无用的)行。

这是一个使用子查询的一些解决方法的线程: How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?

答案 1 :(得分:2)

这是“每组最大n”问题的一个子集。 (有一个带有该名称的标签,但我是新用户,因此我无法重新标记)。

这通常最好使用分析函数处理,但也可以使用同一个表通过连接写入子查询。在子查询中,您标识最大值,然后连接到键上的原始表以查找与最大值匹配的行。

假设{dateofclose,symbol,market}是您想要最大音量的粒度,请尝试:

select
    a.*, b.max_volume
from daily a
join
(
    select
        dateofclose, symbol, market, max(volume) as max_volume
    from daily
    group by
        dateofclose, symbol, market
) b
on
    a.dateofclose = b.dateofclose
    and a.symbol = b.symbol
    and a.market = b.market

另见this post以供参考。

答案 2 :(得分:0)

您是否尝试调整查询以在分组中包含符号?

    SELECT max(volume), dateofclose, symbol, 
   volume, close, market FROM daily group by market, symbol