我有两个表,一个有两个有日期的列。另一个列有一个日期列,另一个列有数字数据。我想加入第二个表的数值列的平均值,其日期列位于第一个表中两个日期列的值之间。如下所示:
表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 :(得分:0)
您可以在加入条件中使用between
运算符:
SELECT date1, date2, AVG(value)
FROM table1
JOIN table2 ON date3 BETWEEN date1 AND date2
GROUP BY date1, date2
答案 1 :(得分: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点降落的任何值都会重复并且会扭曲你的平均值。
您可以通过以下两种方式解决此问题。
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。