2010-11-09 52 views
0

我试图MySQL服务器(5.1.41)在此查询...MySQL的 - 马克斯()返回错误的结果

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子句的特定日期,则会出现不同的最大(音量)结果的相同符号。这很奇怪...

需要一些帮助在这里!

UPDATE:

这里是我主编的 “工作” 要求:

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

“真实”价值是什么意思? MAX的市场价值回报最高。 – 2010-11-09 02:39:00

+0

是的,但相应的列似乎不匹配。添加卷列以选择显示此。 – 2010-11-09 03:02:07

+1

如果您选择不在GROUP BY中的列,MySql似乎不会出错。 (SQL Server会引发错误。) – beach 2010-11-09 05:11:43

回答

7

正如你所看到的,最大音量是从体积列的“真实”价值非常不同?!?

这是因为MySQL以奇怪的方式而不是GROUP事情。

选择MAX(column)会得到你该列的最大值,而选择其他列(或column本身)将不一定选择整行的发现MAX()值。你基本上得到一个任意的(通常无用)排回去。

下面是使用子查询一些解决方法螺纹: How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?

+0

这就是诀窍!我应用了配方,这是我的结果查询:SELECT tt。* from daily tt内部连接(选择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 – 2010-11-09 03:14:36

0

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

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

这不起作用。我得到了24 963个结果,其中最大(体积)与体积栏不同。 :-( – 2010-11-09 02:48:06

2

这是“每组最大的N”问题的一个子集。 (有一个名称的标签,但我是一个新用户,所以我不能重新标记)。

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

假设{dateofclose,符号,市场}是指您需要的最大音量的粮食,尝试:

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以供参考。

+1

Humm,这是行不通的。经过30秒的思考,它返回的结果数与本表中的行数完全相同我清理了我的请求,它看起来像这样:SELECT a。* FROM daily INNER JOIN(SELECT market,MAX(volume)AS max_volume FROM daily WHERE dateofclose ='20101108'GROUP BY market)b ON a.market = b 。市场和a.volume = b.max_volume – 2010-11-10 13:35:07