2010-11-09 53 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