2010-09-13 47 views
2

我有以下查詢的多個時間段:SQL均相同的數據集

SELECT AVG(val) from floatTable 
WHERE tagindex IN(1,2,3,4) 
AND DateAndTime > '$first_of_year' 

它返回這四個標籤爲今年迄今測得的所有值的平均值。由於我已經檢索了這些數據,自從本週的第一天以來,從本月的第一天開始,我如何才能獲取數據?我已經將這些日期計算爲$ first_of_month,$ first_of_week和$ midnight。我試圖最大限度地減少查詢,並希望有人能夠幫助我汲取一些SQL魔法來在單個查詢或一組優化的查詢中返回這些數據。這個查詢平均需要300秒,所以我想盡可能少地做到這一點。

預先感謝您。

+0

如果您不想過多地往返數據庫,您可以簡單地將這些平均值放入子查詢中。就我的數學專業來說,平均數不能分開或合併,所以你真的需要在不同的時間段重新計算它們。 – 2010-09-13 18:17:25

+0

@Denis,參見RedFilter的答案。子查詢不需要額外訪問數據庫,但*會*在查詢中需要額外的邏輯讀取 - 因此查詢的總體時間可能長達四倍。至於平均值,大多數SQL版本完全忽略了聚合計算中的NULL值 - 因此RedFilter查詢中的四個不同表達式將被正確計算(因爲不符合條件的值將被評估爲NULL)。 – 2010-09-14 13:33:35

+1

@Mark Ba​​nnister,在RedFilter公佈他的答案並立即從中學習並且我想留下我對後人的評論以從我的快速假設中學習時,我默默承認了我的失禮。 – 2010-09-14 14:38:17

回答

5
SELECT AVG(case when DateAndTime > '$first_of_year' then val end) as FirstOfYear, 
     AVG(case when DateAndTime > '$first_of_month' then val end) as FirstOfMonth, 
     AVG(case when DateAndTime > '$first_of_week' then val end) as FirstOfWeek, 
     AVG(case when DateAndTime > '$midnight' then val end) as Midnight 
from floatTable 
WHERE tagindex IN(1,2,3,4) 
    and DateAndTime > '$first_of_year' 

爲了提高性能,請確保您有列DateAndTimetagIndex指標。

+0

這很好...它怎麼比我原來的查詢快得多? – user438199 2010-09-13 18:20:11

+1

它不應該比你的問題中的查詢更快,但它可能不會比任何(很多)慢,儘管你需要添加額外的列。當你提到「原始查詢」時,你的意思是你的問題中的一個還是你有一個得到你想要的所有其他平均值?這可能是一個緩存問題 - 您已經運行了一個查詢,以便SQL Server將該數據存儲在內存中。 – 2010-09-13 18:38:47

+0

@ user438199請確認您的意思是>我認爲您的意思是> ='$ first_of_year' – 2010-09-13 18:56:15

相關問題