繁体   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