[英]Sql query join average of one column where another column is between two columns values of another table
我有兩個表,一個有兩列有日期。 另一列包含日期,另一列包含數字數據。 我想加入第二張表的數字列值的平均值,其中它的日期列在第一張表的兩個日期列的值之間。 類似於以下內容:
表格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
您可以在聯接條件中使用between
運算符:
SELECT date1, date2, AVG(value)
FROM table1
JOIN table2 ON date3 BETWEEN date1 AND date2
GROUP BY date1, date2
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
要么
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
則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個邊,如上面的示例所示。 注意sql-server的DATETIME
精確到3毫秒,因此,如果您輸入3:59:59.999或.998,則將其與4:00:00.000相同,解決方法是使用.997。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.