这可能是使用LEAD还是有更好的方法?

时间:2017-07-20 19:18:41

标签: sql sql-server sql-server-2012

我想从2个表中返回下面的数据集。表A将具有温度读数,表B将具有湿度读数。它们也会在每个表中都有时间戳,例如:

表A

enter image description here

表B

enter image description here

基本上我想让输出得到温度和下一个最接近温度时间戳的湿度读数。所以例如输出看起来像这样:

enter image description here

所以我想从表A开始,然后根据时间戳找到表B中同一传感器的下一个最接近的记录。

2 个答案:

答案 0 :(得分:1)

我喜欢这里的十字架申请。示例:http://rextester.com/RGPS53348http://rextester.com/EKDX38312的时间越短

基本上对于A中的每条记录,在B中找到匹配预告片和区域的记录以及具有最接近时间的记录

这应该返回"最近的时间"对于与温度时间相关的湿度,如果是温度,则从湿度返回较早的时间/记录。

SELECT A.Trailer, A.Zone, A.temp, B.Humidity, A.Time A_time, B.Time B_Time
FROM tableA A
CROSS APPLY (SELECT Top 1 Z.* 
             FROM tableB  Z
             WHERE A.Trailer = Z.Trailer
               and A.Zone = Z.Zone
             --ORDER BY abs(A.Time- Z.Time) Asc, Z.Time) B --if int data
             ORDER BY abs(datediff(ss,A.Time,Z.Time)),Z.time) B --

查询基本上是说..

  • 对于A中的每条记录,运行子查询以查找具有相同预告片和区域的A记录上时间最接近时间[abs(A.time-Z.time)]的记录。
  • 在tie的情况下,返回前面的b记录。

  • 显示A记录的预告片,区域,温度和时间以及b记录的湿度和时间。

答案 1 :(得分:0)

您可以使用first_value窗口功能来执行此操作。

select distinct a.*
,first_value(b.humidity) over(partition by a.trailer,a.zone,a.time order by b.time) as humidity
from tblA a
join tblB b on a.trailer=b.trailer and a.zone=b.zone and a.time<=b.time

如果您希望在以后的表格中没有此类湿度值时显示left join,请在tableA上使用null