首页 > 解决方案 > 仅在 SQL Server 中该特定名称的所有重叠日期范围的最小和最大日期

问题描述

我想要 SQL Server 中重叠日期范围的最小开始日期时间和最大结束日期时间以及不重叠日期范围的相同开始和结束日期时间

示例:- My_table

姓名 开始日期时间 结束日期时间
阿曼 01-02-2020 04:30 01-02-2020 06:30
阿曼 01-02-2020 08:30 01-02-2020 09:30
阿曼 01-02-2020 04:40 01-02-2020 05:30
阿曼 01-02-2020 04:55 01-02-2020 07:30
阿曼 01-02-2020 14:55 01-02-2020 18:30
阿曼 01-02-2020 13:40 01-02-2020 15:30
内存 01-02-2020 04:40 01-02-2020 05:30
内存 01-02-2020 04:40 01-02-2020 05:30

预期结果将只是重叠的日期和时间:

所有重叠日期范围之间的最短和最长时间

姓名 开始日期时间 结束日期时间
阿曼 01-02-2020 04:30 01-02-2020 07:30
阿曼 01-02-2020 08:30 01-02-2020 09:30
阿曼 01-02-2020 13:40 01-02-2020 18:30
内存 01-02-2020 04:40 01-02-2020 05:30

结果值的第一行具有重叠的日期范围,因此我们仅调整该名称列的所有重叠日期范围的最小值和最大值。

第二行没有任何重叠,所以我们照原样写。

第三行是重叠的,所以我们写了阿曼重叠日期的最小值和最大值。

第四行也是重叠的,所以我们用最小和最大日期范围对其进行一次修正。

标签: sqlsql-server

解决方案


您可以使用如下分析函数:

Select name, min(startime), max(endtime)
  From
(Select t.*,
       Sum(case when lgendtime between startime and endtime then 0 else 1 end) 
           over (partition by name order by starttime)  as sm
  from
(Select t.*,
       Lag(endtime) over (partition by name order by starttime) as lgendtime
  From your_table t) t) t
Group by name, sm

推荐阅读