Sql查询连接一列的平均值,其中另一列在另一个表

时间:2016-07-01 20:17:03

标签: sql sql-server select

我有两个表,一个有两个有日期的列。另一个列有一个日期列,另一个列有数字数据。我想加入第二个表的数值列的平均值,其日期列位于第一个表中两个日期列的值之间。如下所示:

表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

2 个答案:

答案 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。