sql - 仅在 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 |
结果值的第一行具有重叠的日期范围,因此我们仅调整该名称列的所有重叠日期范围的最小值和最大值。
第二行没有任何重叠,所以我们照原样写。
第三行是重叠的,所以我们写了阿曼重叠日期的最小值和最大值。
第四行也是重叠的,所以我们用最小和最大日期范围对其进行一次修正。
解决方案
您可以使用如下分析函数:
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
推荐阅读
- r - 来自给定范围的 R 独特组合快速且使用更少的系统资源
- reactjs - How to properly Handle a state by user typing and timeout Reactjs
- python - 如何在 PySpark 的成对 RDD 中使用转换?
- excel - 循环浏览工作表时出错。返回对象变量或未设置块变量
- django - 如何返回查询集和字典
- c++ - CMake 与需要与项目一起构建的第 3 方库
- flutter - 为什么标签栏小部件 Navigator.pop(context) 返回黑屏?
- c++ - 使用指针返回一个新数组
- ios - 如何将 [UILabel] 的集合转换为字符串文本以显示在 ViewController 上?
- javascript - 从 javascript hashmap 中迭代键会为最后一个元素提供空字符串