2017-04-24 29 views
0

我在下面有一個查詢,它給了我一年中一個人走過的時間總數(大於2英里/小時)與查詢總條數(總小時數記錄)。兩者基本上都是相同的查詢,除了第一個中的最後一個子句外。問題是運行此查詢需要30秒。有沒有辦法讓我結合這兩個查詢,使其運行速度更快,但獲得類似的數據?我的最終目標是讓一個人走過的時間百分比大於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

大概你已經改變了張貼的查詢,即使如此,'上面(名字)'%Sarah%''看起來很奇怪,因爲它永遠不會是真的。而且在一年中最後一天的午夜之後,您的電子小時過濾器不會有任何收穫。 –

+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英里/小時以上的總小時數,而不是2英里/小時以上的平均速度。 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)過濾器,這將永遠是NULL所以你可以做一個RIGHT OUTER JOIN,而不是FULL OUTER JOIN。根據STARTING_HOUR列所在的表格,這可以進一步簡化爲INNER JOIN

+0

你好MT0!這正是我需要的。該查詢只需要15秒即可運行。我仍然需要額外的連接,因爲我需要該表來查找人名。該中間表將傳感器ID與鏈接到名稱的帳戶ID鏈接。我在發帖時犯了一個錯誤,它應該是ON SENSOR.SPEED.Sensor_ID = ACCOUNT.ID.Sensor_ID –

+0

有沒有其他技術可以用來加速它甚至更多呢? –