2015-08-25 28 views
0

我想檢索/計算給定日期的不同資產的價格,具體取決於交易的方面。在2000年之前,我有中期報價,之後我已經出價並詢問或提供報價,所以我希望價格是這兩個報價的平均值。更確切地說:使用條件在MySQL中檢索和計算價格

SELECT date, price, 
CASE WHEN side='' THEN 'price_mid' 
WHEN side='A' THEN 'price_ask' 
WHEN side='B' THEN 'price_bid' 
WHEN side='O' THEN 'price_offer' 
END as prices 
FROM table 
WHERE asset = 'a'; 

我怎麼能那麼計算的價格在新的一列,有(2000年以前)的price_mid和(price_bid + price_ask)/ 2或(price_bid + price_offer)/ 2之後?

例如:比方說,我有以下的情況:

date price  prices 
1   1  price_mid 
2  1.1  price_mid 
3  0.9  price_bid 
3  1.2  price_ask 
4  1.3  price_offer 
4  1.1  price_bid 

我想有:

date final_price 
1   1 
2   1.1 
3   1.05 
4   1.2 
+0

可以請你分享你的表的模式和預期的結果嗎? – mynawaz

+1

謝謝您的回覆。我編輯了這個問題並添加了它們。 – Astrid

+0

有哪些可能性?你想處理哪些元組?如果你有price_mid,price_offer和price_ask,你想要什麼? – inetphantom

回答

3

我理解你所需要的平均只有一些日期。也許下面的你想要做什麼:

SELECT date, AVG(price) as AvgValue 
FROM prices 
WHERE date >= 2 
AND prices in ('price_ask','price_offer','price_bid') 
GROUP BY date 
UNION 
SELECT date, price as AvgValue 
FROM prices 
WHERE date < 2 
AND prices = 'price_mid' 
GROUP BY date 
UNION 
SELECT date, price as AvgValue 
FROM prices p 
WHERE date >= 2 
AND prices = 'price_mid' 
AND NOT EXISTS (SELECT 1 FROM prices p2 where p2.date = p.date AND p2.prices in ('price_ask','price_offer','price_bid')) 
GROUP BY date 
ORDER BY DATE ASC 
+0

如果你有price_mid,price_ask和price_bid,你會怎麼做? – inetphantom

+0

我更新了查詢,這更接近你現在想要的嗎?我想了解這個要求。對於舊日期,您只需要price_mid,對嗎?對於較新的日期,您想忽略price_mid並計算其他所有存在的平均值? – dchar

+0

@dchar謝謝你的回答。你說的是正確的,但可能是在同一天,我有更多的價格。經過一段時間後,我再也沒有price_mid了,所以我想單獨採用平均出價和詢問或者出價和報價,因爲有些報價有所不同。根據我的理解,這意味着在你的代碼中,最後的聯合不是必需的,對吧?再次感謝! – Astrid

0

像這樣的事情

SELECT `date`, AVG(price) AS final_price FROM tbl GROUP BY 1 
+0

如果你有price_mid,price_ask和price_bid,你會怎麼做? – inetphantom

0

嘗試過的東西,它沒有工作,不過也許可以幫助...

這是變了一個版本,你已經擁有了查詢,但它確實不保存一種狀態,它只有正確的地方的所有值。

SELECT 
    date, 
    CASE WHEN side = '' THEN price 
         ELSE NULL 
    END as price_mid, 
    CASE WHEN side = 'A' THEN price 
         ELSE NULL 
    END as price_ask, 
    CASE WHEN side = 'B' THEN price 
         ELSE NULL 
    END as price_bid, 
    CASE WHEN side = '' THEN price 
         ELSE NULL 
    END as price_offer 
FROM 
    table 
WHERE 
    asset = 'a'; 

什麼應該給你:

date price_mid price_ask price_bid price_offer 
1   1  NULL  NULL  NULL 
2  1.1  NULL  NULL  NULL  
3  NULL  NULL  0.9  NULL 
3  NULL  1.2  NULL  NULL 
4  NULL  NULL  NULL  1,4 
4  NULL  NULL  1.1  NULL 

現在那張桌子上,你可以用IS NULL檢查或採取SUM()MAX()每日期,所以你可以在一行上通過你的情況下進行切換。

+0

對不起,我沒有達到我想要達到的目標,也許我明天就完成了答案。但是有一種方法,當你有三個這樣的值時不會殺死它(就像其他人失敗一樣) – inetphantom