基于 datetime2 谓词连接表
Joining tables based on datetime2 predicate
如何在 TripID 上加入 tables 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 < 但它会遗漏警报 C。我可以尝试 > AND <= 但它会遗漏警报 A。
如何捕获所有 3 个警报而不对某些警报产生笛卡尔积?
理想情况下,解决方案也将保留索引。
[table 个对象]
您可以使用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;
但是,您应该修复数据。通常对于日期时间值和范围,第一个值是范围的一部分而第二个不是。
如何在 TripID 上加入 tables 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 < 但它会遗漏警报 C。我可以尝试 > AND <= 但它会遗漏警报 A。
如何捕获所有 3 个警报而不对某些警报产生笛卡尔积?
理想情况下,解决方案也将保留索引。
[table 个对象]
您可以使用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;
但是,您应该修复数据。通常对于日期时间值和范围,第一个值是范围的一部分而第二个不是。