2017-10-31 11 views
-1
select *, (T3.price_usd - T1.price_usd)/T3.price_usd as b 
from ticker T1 
INNER JOIN mycoins T2 
    ON T1.symbol = T2.symbol 
INNER JOIN ticker T3 
    ON T1.symbol = T3.symbol 
WHERE T1.timer = (Select max(timer) from ticker) 
    AND T3.timer = (Select min(timer) from ticker where timer 
         > (Select max(timer) from ticker - 60*60*24*7*2)) 

上記のコードには、(Select max(timer) from ticker)がクエリで複数回実行されるという問題があります。これは、最大タイマー値が複数回使用されるためです。このコードを改善して最大タイマーを一度決定してからその値を再利用する方法はありますか?繰り返し計算のためのSQLの最適化

+3

タグuはSQL'がちょうどクエリ言語である '使用してrのDBMS(MySQLの、MS SQL Serverの、など...)。 –

+0

クエリはエラーなしで実行されていますか? –

+0

これはウィンドウ関数を使用してより良く解決されました –

答えて

1

私はあなたが非常に簡単に調整し、パフォーマンスに良いを使用して、ストアの手順を使用する必要がありますだと思います。ここで

は、あなたのシナリオの

CREATE PROCEDURE test 
AS 
BEGIN 
    Declare @max int 

    Set @max = (Select max(timer) from ticker); 

    select *, (T3.price_usd - T1.price_usd)/T3.price_usd as b 
     from ticker T1 
     INNER JOIN mycoins T2 
     ON T1.symbol = T2.symbol 
     INNER JOIN ticker T3 
     ON T1.symbol = T3.symbol 
     WHERE T1.timer = @max AND 
     T3.timer = (Select min(timer) from ticker where timer > (@max - 60*60*24*7*2)) 

END 
GO 
+0

助けをありがとう。 –

+1

dbmsが指定されていない質問に対する製品固有の回答。少なくとも、これがどのdbmsであるかを教えてください。 – jarlh

+0

ありがとう、私はそれを更新しました –

2

最適化クエリは、SQL Server、アプローチを以下であるMS SQL Serverのサンプルです!

-- Declare Varaibles 
declare @MaxTime int 
declare @MinTime int 

-- Set values ,Need not to use inside query as recurrncy reduce processing 
Select @MaxTime=max(timer) from ticker 
Select @MinTime=min(timer) from ticker where timer > (Select max(timer) from ticker - 60*60*24*7*2)) 


-- Create complex query 
select *, (T3.price_usd - T1.price_usd)/T3.price_usd as b 
from ticker T1 
INNER JOIN mycoins T2 
ON T1.symbol = T2.symbol 
INNER JOIN ticker T3 
ON T1.symbol = T3.symbol 
WHERE T1.timer = @MaxTime AND 
T3.timer = @MinTime 
+0

助けてくれてありがとう。 –

+0

ええ、あなたは解決策を受け入れることができます:それが動作する場合: – UJS

0

あなたがこれを使用することができます:

declare @MaxTime bigint 
declare @MinTime bigint 

Select @MaxTime = max(timer) from ticker 
Select @MinTime = min(timer) from ticker where timer > (@MaxTime - 60*60*24*7*2) 

select *, (T3.price_usd - T1.price_usd)/T3.price_usd as b 
from ticker T1 
INNER JOIN mycoins T2 
    ON T1.symbol = T2.symbol 
INNER JOIN ticker T3 
    ON T1.symbol = T3.symbol 
WHERE T1.timer = @MaxTime 
    AND T3.timer = @MinTime 
+0

dbmsが指定されていない質問に対する製品固有の回答。少なくとも、これがどのdbmsであるかを教えてください。 – jarlh

関連する問題