【问题标题】:Joining tables based on datetime2 predicate基于 datetime2 谓词连接表
【发布时间】:2021-08-23 23:16:12
【问题描述】:

如何在 TripID 上连接表 A 和 B(见图)以及 TimeTriggered 在 SegmentStart 和 SegmentEnd 之间的位置?

我可以试试:

FROM TableA A
INNER JOIN TableB B
ON A.TripID = B.TripID
AND B.TimeTriggered BETWEEN A.SegmentStart AND A.SegmentEnd

但是,由于 BETWEEN 在两端都包含在内,它会将警报 B 加入到分段 1 和 2。

我可以尝试 >= AND AND

如何捕获所有 3 个警报而不引起某些人的笛卡尔积?

理想的解决方案也是保留索引。

[表格对象]

【问题讨论】:

  • 似乎您想要>=<><= 逻辑,或者您的数据错误。显然,第 2 部分连接到其他 2 行,或者其他行之一与其他行没有关系。
  • 所以警报 B 应该与每个片段一起使用,为什么?或者你也不介意
  • 然而,正如拉努所说,您的数据不正确,最好的解决方案是修复您的数据
  • 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。

标签: sql sql-server tsql join datetime2


【解决方案1】:

您可以使用apply任意选择其中一个:

SELECT . . . 
FROM TableA A CROSS APPLY
     (SELECT TOP (1) B.*
      FROM TableB B
      WHERE A.TripID = B.TripID AND
            B.TimeTriggered BETWEEN A.SegmentStart AND A.SegmentEnd
     ) B;

但是,您应该修复您的数据。通常使用日期时间值和范围,第一个值是范围的一部分,第二个不是。

【讨论】:

  • 我不确定我是否了解如何修复数据。不幸的是,不知道警报 B 应该属于分段 1 还是分段 2,因为表 B 中没有分段 ID 可以显式加入。如果我使用 >= 和
  • @thesnowplow 。 . .问题是开始时间和结束时间。您应该有一个结构,其中区间的结尾不是区间的一部分。
  • 我觉得我太密集了,无法理解这一点。一个段的结束时间是下一个段的开始时间。您的建议是,情况不应该如此,在一个段结束和下一个段开始之间应该有一个小的单位增量?
  • @thesnowplow 。 . .确切地。这就是我想说的。段的结束时间不应是该段的一部分。它应该与 next 段相关联。
  • 顺便说一句,我刚刚意识到你的名字似乎很熟悉.. 看了看我的书架,它在我几年前拿起的“使用 SQL 和 Excel 进行数据分析(第二版)”的副本上.令人惊奇的东西.. 非常感谢!
猜你喜欢
  • 2022-01-20
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多