如何解决TSQL - 查询差异和聚合重叠
样本数据:
DECLARE @ExpectedBookingTimes TABLE
(
[EId] INT,[BookingDate] DATE,[BeginDT] DATETIME2(7),[EndDT] DATETIME2(7),[BookingType] INT
)
DECLARE @RealBookingTimes TABLE
(
[RId] INT,[BookingType] INT
) ;
INSERT INTO @ExpectedBookingTimes
VALUES
( 1,'2021-01-01','2021-01-01 12:00:00.0000000','2021-01-01 12:59:59.9999999',1 ),( 2,'2021-01-02','2021-01-02 12:00:00.0000000','2021-01-02 12:59:59.9999999',2 ),( 3,'2021-01-03','2021-01-03 12:00:00.0000000','2021-01-03 13:59:59.9999999',1 ) ;
INSERT INTO @RealBookingTimes
VALUES
( 10,'2021-01-01 13:00:00.0000000','2021-01-01 13:59:59.9999999',( 20,'2021-01-02 12:15:00.0000000','2021-01-02 12:44:59.9999999',( 30,'2021-01-03 13:00:00.0000000','2021-01-03 14:59:59.9999999',( 40,'2021-01-03 15:00:00.0000000','2021-01-03 15:59:59.9999999',2 ) ;
目标:
-- 在同一预定日期内
---- 如果预期预订类型 = 真实预订类型,则只返回来自@RealBookingTimes 的记录
-----> 在 EId = 2 和 RId = 20 之间,排除 EId = 2 并返回 RId = 20 记录
----否则如果有日期时间重叠,返回MIN(BeginDT)和MAX(EndDT)
-----> 在 EId = 3 和 RId = 30 之间,返回 BeginDT = 2021-01-03 12:00:00.0000000 和 EndDT = 2021-01-03 14:59:59.9999999
---- 否则,返回其他所有内容
-----> RId = 1,EId = 10,and EId = 40 ;
预期输出:
EId,RId,BookingDate BeginDT,EndDT
1,NULL,'2021-01-01 12:59:59.9999999' (Met condition # 3)
NULL,10,'2021-01-01 13:59:59.9999999' (Met condition # 3)
NULL,20,'2021-01-02 12:44:59.9999999' (Met condition # 1)
3,30 '2021-01-03','2021-01-03 14:59:59.9999999' (Met condition # 2)
NULL,40,'2021-01-03 15:59:59.9999999' (Met condition # 3)
我在想什么:
为了满足条件 #1,我可以在 BookingDate AND BookingType 上执行 INNER JOIN 并从 @ExpectedBookingTimes 中删除匹配
为了满足条件 #2,我可以在 BookingDate 执行 INNER JOIN 并重叠检查并返回 Min/Max(对这个还不太确定)
其他一切都会落入条件 #3 的范围内。
然后我会将所有它们联合起来,由 [BeginDT] ASC 订购。
但这似乎是一个昂贵的过程,因为真正的表会非常大。所以基本上是想找出一种有效的方法来查询这些数据
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。