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

Sql 这可能是使用铅还是有更好的方法?,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我想从两个表返回下面的数据集。表A有温度读数,表B有湿度读数。每个表中都有时间戳,例如: 表A 表B 基本上,我希望输出得到温度和下一个最接近温度时间戳的湿度读数。例如,输出如下所示: 因此,我想从表A开始,然后根据时间戳查找表B中同一传感器的下一个最近的后续记录。您可以使用first\u value窗口函数来执行此操作 select distinct a.* ,first_value(b.humidity) over(partition by a.trailer,a.zone,a.tim

我想从两个表返回下面的数据集。表A有温度读数,表B有湿度读数。每个表中都有时间戳,例如:

表A

表B

基本上,我希望输出得到温度和下一个最接近温度时间戳的湿度读数。例如,输出如下所示:


因此,我想从表A开始,然后根据时间戳查找表B中同一传感器的下一个最近的后续记录。

您可以使用
first\u 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
选择不同的a*
,第一个_值(b.湿度)(由a.拖车划分,a.分区,a.时间顺序由b.时间划分)作为湿度
来自tblA a

在a.traile=b.traile和a.zone=b.zone和a.time上加入tblB b我喜欢在这里交叉应用。例子:或者时间比较近

基本上,对于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)]的记录
  • 如果是平局,返回较早的b记录

  • 显示A记录的拖车、区域、温度和时间以及b记录的湿度和时间


这些表应该如何连接?我在猜测拖车和区域,因为这是我想要获得读数的原因。两个表都没有湿度。这是如何计算的?这是我的错误,我现在更正了表B。是否所有的温度都有相应的湿度,或者一个或另一个温度之间是否存在间隙,使得湿度读数或温度读数可能与另一个温度读数中的一个或多个相关联?在最后一行中,查询不喜欢B.Time。。。。那应该是Z时间吗?我还返回以下错误“不允许从数据类型datetime隐式转换为float。请使用CONVERT函数运行此查询”是,它是。我的错误;并按b.时间顺序更正。至于另一个错误,我假设时间是一个数字,因为你的例子显示了数字;但这些评论似乎暗示这是一种时间数据类型。它是什么?日期时间还是时间?还是怎样如果一个日期数据类型我们需要使用abs(datediff(n,a.Time,B.Time))
或者如果秒很重要的话,我们可以得到更精确的数据类型。大多数情况下,最接近的记录大约是一秒后,yesHI all,今天这个代码有一个小问题,希望看看是否有修复。在交叉应用中,如果表B中没有与A中的记录匹配的记录,是否有方法返回该记录?如果即使使用B的空值?我相信您希望使用
外部应用
而不是交叉应用。如果有where子句(在外部联接上),请确保它不会被B的任何结果过滤,否则外部应用将被视为交叉应用。而是在子查询中应用这些过滤器。哪里交叉应用类似于内部连接,外部应用类似于左连接。在未来,一旦答案被接受,就应该提出单独的问题