【发布时间】:2020-05-06 22:27:08
【问题描述】:
我有一个人的开始和结束日期的数据范围,我想只获得每个人的连续日期范围:
输入:
NAME | STARTDATE | END DATE
--------------------------------------
MIKE | **2019-05-15** | 2019-05-16
MIKE | 2019-05-17 | **2019-05-18**
MIKE | 2020-05-18 | 2020-05-19
预期输出如下:
MIKE | **2019-05-15** | **2019-05-18**
MIKE | 2020-05-18 | 2020-05-19
所以基本上输出是人的每个连续时期的 MIN 和 MAX。
感谢任何帮助。
我尝试了以下查询:
With N AS ( SELECT Name, StartDate, EndDate
, LastStop = MAX(EndDate)
OVER (PARTITION BY Name ORDER BY StartDate, EndDate
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) FROM Table ), B AS ( SELECT Name, StartDate, EndDate
, Block = SUM(CASE WHEN LastStop Is Null Then 1
WHEN LastStop < StartDate Then 1
ELSE 0
END)
OVER (PARTITION BY Name ORDER BY StartDate, LastStop) FROM N ) SELECT Name
, MIN(StartDate) DateFrom
, MAX(EndDate) DateTo FROM B GROUP BY Name, Block ORDER BY Name, Block
但它没有考虑连续周期。它显示相同的输入。
【问题讨论】:
-
你试过什么?你在哪里卡住了?
-
将您尝试过的内容添加到您的问题中。
-
但不考虑连续周期..它只会显示最小值和最大值..
标签: sql sql-server gaps-and-islands