簡體   English   中英

SQL查詢聯接一列的平均值,其中另一列在另一表的兩列值之間

[英]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:006/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM