我想从2个表中返回下面的数据集。表A将具有温度读数,表B将具有湿度读数。它们也会在每个表中都有时间戳,例如:
表A
表B
基本上我想让输出得到温度和下一个最接近温度时间戳的湿度读数。所以例如输出看起来像这样:
所以我想从表A开始,然后根据时间戳找到表B中同一传感器的下一个最接近的记录。
答案 0 :(得分:1)
我喜欢这里的十字架申请。示例:http://rextester.com/RGPS53348或http://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 --
查询基本上是说..
在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
。