2017-04-24 6 views
0

私は1人の人が2 mph以上歩く合計時間数を私に与える以下のクエリを持っています。合計エントリ数(合計時間数記録された)。どちらも基本的に最初のものの最後の句を除いて同じクエリです。問題は、このクエリを実行するのに30秒かかることです。 2つのクエリを結合してより速く実行する方法はありますか?同様のデータが得られますか?私の最終目標は、人が2mph以上を歩く時間のパーセンテージを得ることです。1つの類似のアクションを持つ2つのクエリを組み合わせる

SELECT COUNT(STARTING_HOUR) FROM SENSOR.SPEED 
FULL OUTER JOIN ACCOUNT.ID 
ON SENSOR.SPEED.Account_ID = ACCOUNT.ID.Account_ID 
FULL OUTER JOIN ACCOUNT.NAME 
ON ACCOUNT.ID.Account_ID = ACCOUNT.NAME.Account_ID 
WHERE UPPER(NAME) LIKE '%Sarah%' 
AND UPPER(NAME) LIKE '%Jones%' 
AND STARTING_HOUR >= TO_DATE('2015-01-01T00:00:00', 'YYYY-MM- 
DD"T"HH24:MI:SS') 
AND STARTING_HOUR <= TO_DATE('2015-12-31T00:00:00', 'YYYY-MM- 
DD"T"HH24:MI:SS') 
AND Value > 2 

UNION 

SELECT COUNT(STARTING_HOUR) FROM SENSOR.SPEED 
FULL OUTER JOIN ACCOUNT.ID 
ON SENSOR.SPEED.Account_ID = ACCOUNT.ID.Account_ID 
FULL OUTER JOIN ACCOUNT.NAME 
ON ACCOUNT.ID.Account_ID = ACCOUNT.NAME.Account_ID 
WHERE UPPER(NAME) LIKE '%Sarah%' 
AND UPPER(NAME) LIKE '%Jones%' 
AND STARTING_HOUR >= TO_DATE('2015-01-01T00:00:00', 'YYYY-MM-DD"T"HH24:MI:SS') 
AND STARTING_HOUR <= TO_DATE('2015-12-31T00:00:00', 'YYYY-MM-DD"T"HH24:MI:SS') 

ありがとうございます!

+2

おそらく、UPPER(NAME)LIKE '%Sarah%'は、決して真実でない可能性があるため、投稿のクエリを変更しました。そして、あなたのstatrting-hourフィルタは、年の最後の日の真夜中後に何も捕まえていません。 –

+0

こんにちはアレックス、それは正しいです。私は検閲のためにデータを少し変更しましたが、本質的にすべての大文字入力を取り込むことになります –

答えて

1

まず、完全な外部結合は完全に不要です。次に、テーブルのエイリアスにより、クエリの書き込みと読み込みが容易になります。そして、あなたはAVG()を用いた演算を行うことができます。

SELECT AVG(CASE WHEN VALUE > 2 THEN 1.0 ELSE 0 END) 
FROM SENSOR.SPEED s JOIN 
    ACCOUNT.ID i 
    ON s.Account_ID = i.Account_ID JOIN 
    ACCOUNT.NAME n 
    ON i.Account_ID = n.Account_ID 
WHERE UPPER(NAME) LIKE '%Sarah%' AND 
     UPPER(NAME) LIKE '%Jones%' AND 
     STARTING_HOUR >= DATE '2015-01-01' AND 
     STARTING_HOUR <= DATE '2015-12-31' ; 

私はWHERE句は、すべての外側が内部結合に参加するターンかなり確信しています。おそらく、あなたはどこかで外部結合をしたいと思うかもしれませんが、必要であることは明らかではありません。

+1

最初の日付に閉じる見積もりがありません。最終的に値> 2のフィルタがなくなっているはずですか? –

+0

こんにちはゴードン!回答ありがとうございます;しかし、私が必要としたのは、2 mphを上回る平均速度ではなく、2 mph /合計時間を上回った人の合計時間でした。 MT0は私が望むものを手に入れることができましたが、私はクエリをスピードアップするために使用できる他のテクニックはありますか?再度、感謝します! –

+0

@ J.D。 。 。 。これは平均速度を返しません。 –

1
SELECT CASE 
     WHEN COUNT(1) = 0 -- Handle division by zero 
     THEN NULL 
     ELSE COUNT(CASE WHEN value > 2 THEN 1 END) 
      /COUNT(1) 
     END AS Percentage 
FROM SENSOR.SPEED 
     RIGHT OUTER JOIN ACCOUNT.NAME 
     ON SENSOR.SPEED.Account_ID = ACCOUNT.NAME.Account_ID 
WHERE UPPER(NAME) LIKE '%SARAH%' 
AND UPPER(NAME) LIKE '%JONES%' 
AND STARTING_HOUR BETWEEN DATE '2015-01-01' AND DATE '2015-12-31' 

ACCOUNT.IDテーブルが必要ですか?代わりに、SENSOR.SPEEDからACCOUNT.NAMEに直接参加できますか?

私はNAMEACCOUNT.NAMEにあり、UPPER(NAME)フィルタと、これはあなたが代わりにFULL OUTER JOINRIGHT OUTER JOINを行うことができますNULLになることはありませんと仮定しています。 STARTING_HOUR列があるテーブルに応じて、これはさらに簡略化してINNER JOINにすることができます。

+0

こんにちはMT0!これはまさに私が必要としていたものです。クエリは今すぐ実行するのに15秒しかかかりません。私は人の名前を調べるためにテーブルを必要として以来、私はまだ余分な参加が必要でした。このミドルテーブルはセンサーIDと、その名前にリンクするアカウントIDをリンクします。私は私の投稿に誤りを犯しました。それはON SENSOR.SPEED.Sensor_ID = ACCOUNT.ID.Sensor_IDだったはずです。 –

+0

私はそれをさらにスピードアップするために使用できる他のテクニックはありますか? –

関連する問題