按名称分组的连续日期范围内的最小和最大日期

问题描述 投票:0回答:1

我有一个人的开始和结束日期的数据范围,我只想获取每个人的连续日期范围:

输入:

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
1个回答
0
投票
这里是使用临时统计表的示例

示例或dbFiddle

;with cte as ( Select A.[Name] ,B.D ,Grp = datediff(day,'1900-01-01',D) - dense_rank() over (partition by [Name] Order by D) From YourTable A Cross Apply ( Select Top (DateDiff(DAY,StartDate,EndDate)+1) D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),StartDate) From master..spt_values n1,master..spt_values n2 ) B ) Select [Name] ,StartDate= min(D) ,EndDate = max(D) From cte Group By [Name],Grp

返回

Name StartDate EndDate MIKE 2019-05-15 2019-05-18 MIKE 2020-05-18 2020-05-19

为了帮助可视化,CTE会生成以下内容

enter image description here
© www.soinside.com 2019 - 2024. All rights reserved.