【问题标题】:MySQL - Max() return wrong resultMySQL - Max() 返回错误结果
【发布时间】:2010-11-09 02:31:57
【问题描述】:

我在 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 日)。

【问题讨论】:

  • “真实”价值是什么意思? MAX 正在返回每个市场价值的最高交易量值。
  • 是的,但对应的列似乎不匹配。添加卷列以选择显示此内容。
  • 如果您选择不在 GROUP BY 中的列,MySql 似乎不会出错。 (SQL Server 会抛出错误。)

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


【解决方案1】:

如您所见,最大音量与音量列的“真实”值有很大不同?!?

这是因为 MySQL 奇怪地没有以一种有意义的方式 GROUP 事情。

选择MAX(column) 将为您获得该列的最大值,但选择其他列(或column 本身)将不一定选择找到的MAX() 值所在的整行in. 你基本上得到了一个任意的(通常是无用的)行。

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

【讨论】:

  • 这样就行了!我应用了配方,这是我的结果查询:SELECT tt.* from daily tt inner join (select dateofclose, symbol, volume, close, market, MAX(volume) as MaxVolume FROM daily group by market) groupedtt on tt.market = groupedtt.market AND tt.volume = groupedtt.MaxVolume
【解决方案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 以供参考。

【讨论】:

  • 哼,这行不通。经过 30 秒的思考,它返回的结果数量与此表中的行数完全相同!我清理了我的请求,它看起来像这样: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.市场 AND a.volume = b.max_volume
【解决方案3】:

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

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

【讨论】:

  • 这不起作用。我得到了 24 963 个结果,其中 max(volume) 仍然与 volume 列不同。 :-(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 2014-02-20
  • 1970-01-01
  • 2021-02-03
相关资源
最近更新 更多