2016-07-01 41 views
1

我有兩個表,其中一列有兩列有日期。另一列有一列有日期,另一列有數字數據。我想加入第二個表的數字列值的平均值,其中的日期列位於第一個表格中兩個日期列的值之間。像下面這樣:SQL查詢連接另一列在另一個表的兩列值之間的一列的平均值

表1:

Date1  Date2 
6/28 2:00 6/30 4:00 
7/1 4:00 7/4 7:00 
... 

表2:

Date3 Value 
6/29 1:00 6.5 
6/30 3:00 2.5 
7/1 5:00 3.0 
7/3 9:00 5.0 
... 

FinalTable:

Date1  Date2 AvgValue 
6/28 2:00 6/30 4:00 4.5 
7/1 4:00 7/4 7:00 4.0 

回答

0

可以使用between運營商在加盟條件:

SELECT date1, date2, AVG(value) 
FROM  table1 
JOIN  table2 ON date3 BETWEEN date1 AND date2 
GROUP BY date1, date2 
+1

謝謝Mureinik,這是正確的答案。儘管我的最終查詢比這更多,但它的工作原理! – bjbreitling

0
SELECT date1, date2, AVG(value) 
FROM  table1 t1 
JOIN  table2 t2 ON t3.date3 >= t1.date1 AND t3.date3 < t1.date2 
GROUP BY t1.date1, t1.date2 

OR

SELECT date1, date2, AVG(value) 
FROM  table1 t1 
JOIN  table2 t2 ON t3.date3 > t1.date1 AND t3.date3 <= t1.date2 
GROUP BY t1.date1, t1.date2 

使用BETWEEN是偉大的,但它是包容的範圍的兩側。因此,如果您的雙重日期表中有重疊範圍,例如6/28 2:00 to 6/28:4:00 AND 6/28:4:00 to 6/28 6:00然後在下午4點登陸的任何值都會重複出現,並歪斜您的平均值。

你可以通過2種方法解決這個問題。

  • 確保您BETWEEN不會導致重疊6/28 2:00 to 6/28 3:59:59.997
  • 不使用BETWEEN和寫出來的大於/等於或小於僅僅是包容性的範圍內的1下側的如在上面的例子。

注爲DATETIME的SQL服務器是精確到3毫秒,所以如果你把在3:59:59.999和0.998這將被視爲相同的4:00:00.000,解決的辦法是使用0.997。

相關問題