2011-07-23 14 views
1

EquityにTickerIDという列があるとします。私は111のものをequity.TickerIDに置き換えたいと思っています。 MySQLは、スコープを解決できないようで、私がそれを試みると、未知の列を返します。このSQL文は機能しますが、私は各ティッカーのためにそれを実行する必要があります。私がフルテーブルを手に入れることができればいいだろう。MySQL Complex Inner Join

SELECT Ticker, 
    IF(tbl_m200.MA200_Count = 200,tbl_m200.MA200,-1) AS MA200, 
    IF(tbl_m50.MA50_Count = 50,tbl_m50.MA50,-1) AS MA50, 
    IF(tbl_m20.MA20_Count = 20,tbl_m20.MA20,-1) AS MA20 
FROM equity 
INNER JOIN 
(SELECT TickerID,AVG(Y.Close) AS MA200,COUNT(Y.Close) AS MA200_Count FROM 
(
    SELECT Close,TickerID FROM equity_pricehistory_daily 
    WHERE TickerID = 111 
    ORDER BY Timestamp DESC LIMIT 0,200 
) AS Y 
) AS tbl_m200 
USING(TickerID) 

INNER JOIN 
(SELECT TickerID,AVG(Y.Close) AS MA50,COUNT(Y.Close) AS MA50_Count FROM 
(
    SELECT Close,TickerID FROM equity_pricehistory_daily 
    WHERE TickerID = 111 
    ORDER BY Timestamp DESC LIMIT 50 
) AS Y 
) AS tbl_m50 
USING(TickerID) 

INNER JOIN 
(SELECT TickerID,AVG(Y.Close) AS MA20,COUNT(Y.Close) AS MA20_Count FROM 
(
    SELECT Close,TickerID FROM equity_pricehistory_daily 
    WHERE TickerID = 111 
    ORDER BY Timestamp DESC LIMIT 0,20 
) AS Y 
) AS tbl_m20 
USING(TickerID) 
+0

最小限のサイズで問題を単純化できませんでしたか?そのコアに? – TMS

答えて

0

これは、MySQLのいくつかのバグまたは「機能」のようです。多くの人が外のテーブルが範囲外であると同じ問題を抱えているようです。

とにかく...あなたが欲しい情報を取り出す関数を作成することができます。

DROP FUNCTION IF EXISTS AveragePriceHistory_20; 

CREATE FUNCTION AveragePriceHistory_20(MyTickerID INT) 
RETURNS DECIMAL(9,2) DETERMINISTIC 
RETURN (
    SELECT AVG(Y.Close) 
    FROM (
     SELECT Z.Close 
     FROM equity_pricehistory_daily Z 
     WHERE Z.TickerID = MyTickerID 
     ORDER BY Timestamp DESC 
     LIMIT 20 
    ) Y 
    HAVING COUNT(*) = 20 
); 

SELECT 
    E.TickerID, 
    E.Ticker, 
    AveragePriceHistory_20(E.TickerID) AS MA20 
FROM equity E; 

あなたはNULL代わりの-1になるだろう。これが望ましくない場合は、関数呼び出しをIFNULL(...,-1)でラップすることができます。


これを解決するための別の方法は、代わりにLIMITを使用するのでは、時間枠を選択することであろう。

SELECT 
    E.TickerID, 
    E.Ticker, 
    (
     SELECT AVG(Y.Close) 
     FROM equity_pricehistory_daily Y 
     WHERE Y.TickerID = E.TickerID 
     AND Y.Timestamp > ADDDATE(CURRENT_TIMESTAMP, INTERVAL -20 DAY) 
    ) AS MA20 
FROM equity E; 
+0

ありがとうございました。私は最終的に内側の選択肢に列IDを取得しようとして残りの部分を喜んでいる。関数のアプローチは非常に面白いです、私はこれらを使用していませんので、あなたの例を実験のためのテンプレートとして使用します。第2のアプローチがうまくいくかどうかはわかりますが、休日や週末など市場がかなり不安定であるため、私の腸の本能はノーと言います – user805547