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