【问题标题】:Is this possible using LEAD or is there a better way?这可以使用 LEAD 还是有更好的方法?
【发布时间】:2017-07-21 04:44:02
【问题描述】:

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

表 A

表 B

基本上,我希望输出为我提供温度和下一个最接近该温度时间戳的湿度读数。因此,例如输出将如下所示:

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

【问题讨论】:

  • 表应该如何连接?
  • 我猜是 Trailer 和 Zone,因为这是我想要阅读的内容。
  • 两个表都没有humidity。这是怎么计算的?
  • 那是我的错误,我现在更正了表 B。
  • 是否所有的温度都具有相应的湿度,或者其中一个或另一个之间是否存在间隙,使得湿度读数或温度读数可能与另一个以上的一个相关联?

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


【解决方案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)] 的记录。
  • 在平局的情况下,返回较早的 b 记录。

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

【讨论】:

  • 在最后一行查询不喜欢 B.Time.... 那应该是 Z.Time 吗?我还返回以下错误“不允许从数据类型 datetime 到浮点数的隐式转换。使用 CONVERT 函数运行此查询”
  • 是的。我的错误;并按 b.time 顺序更正。至于另一个错误,我认为时间是一个数字,因为您的示例显示了数字;但 cmets 似乎暗示它是一种时间数据类型。它是什么?日期时间或时间?或者是什么?如果是日期数据类型,我们需要使用abs(datediff(n,A.Time, B.Time)),或者如果秒数很重要,我们可以得到更精细的数据。
  • 大多数情况下,最接近的记录大约会晚一秒,是的
  • 大家好,今天这段代码有一个小问题,想看看是否有修复。如果表 B 中没有与 A 中的记录匹配的记录,则在交叉应用中是否可以返回该记录?如果即使是来自 B 的 NULL?
  • 我相信你想使用 OUTER APPLY 而不是交叉应用。确保您的 where 子句(在外部连接上)(如果有)不会被 B 的任何结果过滤,否则外部应用将被视为交叉应用。而是在子查询中应用这些过滤器。在哪里。 social.msdn.microsoft.com/Forums/vstudio/en-US/… CROSS 应用类似于内部联接,外部应用类似于 LEFT 联接。将来,一旦答案被接受,就应该提出单独的问题
【解决方案2】:

您可以使用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

如果您想在以后在表 B 中不存在此类湿度值时显示 nulls,请在表 A 上使用 left join

【讨论】:

    猜你喜欢
    • 2014-11-21
    • 2011-07-03
    • 2011-04-14
    • 2013-07-12
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    相关资源
    最近更新 更多