Merge/Combine 在 SQL 中使用循环的连续日期记录

Merge/Combine continuous date records using loop in SQL

我有一个要求,我需要合并连续的记录,属于特定类型的组和其他一些条件。

  1. 列表项

要合并记录 - 只有当它以 主要组 开始时,我们才应该将其视为连续的,因此即使认为它是连续的,这里的第一个记录也应该被视为单独的

  1. 列表项

如果未作为主要组结束,则不要合并,

  1. 列表项

如果有一天的间隔就不要合并

MemberName   Group  StartDate      EndDAte
Priya         Sub   01/01/2017     01/20/2017 --Do not merge,not started in Main
Priya         Main  01/20/2017     01/30/2017 --merge
Priya         Sub   01/30/2017     02/05/2017 --merge
Priya         Main  02/06/2017     02/06/2017 --Do not merge,Break
Priya         sub   02/07/2017     02/15/2017 --Do not merge,not started in Main
Priya         Main  02/15/2017     02/20/2017 --Merge
Priya         Main  02/20/2017     02/25/2017 --Do not merge,Break
Priya         sub   02/28/2017     02/28/2017 --Do not merge,break also did not end as Main

输出应如下所示:

MemberName   Group  StartDate      EndDAte
Priya        Sub    01/01/2017     01/20/2017 
Priya        Main   01/20/2017     02/05/2017
Priya        Main   02/06/2017     02/06/2017
Priya        sub    02/07/2017     02/15/2017
Priya        Main   02/15/2017     02/25/2017
Priya        sub    02/28/2017     02/28/2017 

我必须在这里使用 If-while 循环。

这不是使用循环完成的,但想测试如何使用 window 函数来完成。结果非常丑陋。很可能它也可以更容易地完成,但是如果您开始从内到外研究它是如何工作的,您可能会学到一些技巧:

select * 
from (
    select *, row_number() over (partition by MemberName, GapTotal, MainGrp order by StartDate) as RN,
    first_value(EndDate) over (partition by MemberName, GapTotal, MainGrp order by StartDate desc) as LastEndDate
    from (
       select * , sum(Main) over (partition by MemberName order by StartDate) as MainGrp
       from (
            select *, case when [Group] = 'Main' and row_number() over (partition by MemberName, GapTotal, [Group] order by StartDate) = 1 then 1 else 0 end as Main
            from (
                select *, sum(Gap) over (partition by MemberName order by StartDate) as GapTotal
                from (
                    select 
                      *, 
                      isnull(datediff(day, lag(EndDate) over (order by StartDate), StartDate),0) as Gap 
                    from #tmp
                ) V
            ) W
        ) X
    ) Y
) Z
where RN = 1
order by MemberName, StartDate

这主要使用 运行 总计的技巧,用它创建分组,然后用于确定是否可以合并行。

Example