如何使用开始和结束日期时间在司机的行程中查找重叠记录

Posted

技术标签:

【中文标题】如何使用开始和结束日期时间在司机的行程中查找重叠记录【英文标题】:How to find the overlapping records in a Trips made from a Driver using Start and End Date Time 【发布时间】:2018-04-02 13:06:53 【问题描述】:

我有一个如下的行程数据集,其中我有给定司机及其相关车辆的行程及其开始和结束日期时间。

Data Set

根据上述情况,我的旅行记录之间的开始日期时间和结束日期时间有重叠。

Processed Data Set

这意味着司机在任何给定时间旅行或旅行不止一次,这是不可能的,因为单个司机可以在给定时间段驾驶一辆车。

所以,我想从数据集中提取它们,留下不重叠的或正确的,如下所示。

Final Requirement

您能否为上述要求推荐 SQL。

最好的问候, 达山女士

【问题讨论】:

考虑发布实际的代码片段和输入/输出数据,而不是图片 请勿张贴图片。将表格添加为文本,以便我们可以轻松地重现该案例。你想要答案,不是吗? Trip 4_12_1306 已被删除,因为它是同一司机在同一天的第二次行程。但是行程 2_12 和 7_12 是司机 1235 的第一次行程。为什么它没有被删除,而您保留行程 ID 8_12 和 11_12?驱动程序之间的规则不一致 @TheImpaler:非常抱歉发布图片,因为我找不到在详细信息部分发布表格的方法,它被视为文本并形成段落。所以,我使用了图片的方法。 @âńōŋŷXmoůŜ:如果我们为司机 1234 安排行程 1_12_1306 和 3_12_1306,他分别从上午 11 点到下午 1:10 和下午 12:10 到下午 1:30 开始了一次行程。实际上,对于给定的驾驶员,除非他完成当前行程,否则他不能开始下一次行程。所以在这种情况下它是错误的,因此它需要显示为输出。 【参考方案1】:

我使用了一个临时表 cte 来收集每个司机重叠的所有 tripID。然后我将使用这些tripID 加入原始表。见下文并在此处示例:http://sqlfiddle.com/#!18/236dd/3

with cte as ( 
    select t1.tripID as ID1, 
           t2.tripID as ID2
    from yourTable t1
    join yourTable t2 
    on t1.driverid=t2.driverid
    where t1.startdatetime between t2.startdatetime and t2.enddatetime
    and t1.tripID > t2.tripID)
select distinct tripID,
       driverid,
       vehicleid,
       startdatetime,   
       enddatetime 
from yourTable t, cte
where t.tripId = cte.ID1
or t.tripId = cte.ID2

【讨论】:

感谢您的回复。我没有考虑行程 4_12_1306,因为它的开始日期时间和结束日期时间条目不与司机为 1234 的任何记录重叠。同样,我没有考虑司机 1235 的 2_12_1306 和 7_12_1306,因为这两个行程的开始日期时间并且 End Date Time 与 Driver 为 1235 的其他记录不重叠 如果我们为司机 1234 安排行程 1_12_1306 和 3_12_1306,他分别从上午 11 点到下午 1:10 和下午 12:10 到下午 1:30 开始了一次行程。实际上,对于给定的驾驶员,除非他完成当前行程,否则他不能开始下一次行程。所以在这种情况下它是错误的,因此它需要显示为输出 谢谢。我现在了解您的要求并更新了我的答案。 非常感谢 âńōŋŷXmoůŜ,SQL 提供了帮助!事实上,子查询以及开始日期时间和结束日期时间提供了彼此相邻的正确信息! 选择 t1.tripID 作为 ID1,从 yourTable t1 中选择 t2.tripID 作为 ID2 在 t1.driverid=t2.driverid 上加入 yourTable t2,其中 t1.startdatetime 介于 t2.startdatetime 和 t2.enddatetime 以及 t1.tripID > t2.tripID

以上是关于如何使用开始和结束日期时间在司机的行程中查找重叠记录的主要内容,如果未能解决你的问题,请参考以下文章

使用 Linq C# 在 DataTable 中查找重叠的日期

如何总结时间,不包括Oracle中给定的开始日期时间和结束日期时间的重叠时间

查找不同行中日期时间间隔的重叠?

我们如何使用 Lyft Webhooks 获取司机行程状态?

如何查找季度、年份、月份、学期开始和结束日期

Oracle SQL 选择具有开始和结束日期的行,如果某些重叠合并行