Merge/Combine 在 SQL 中使用循环的连续日期记录
Merge/Combine continuous date records using loop in SQL
我有一个要求,我需要合并连续的记录,属于特定类型的组和其他一些条件。
- 列表项
要合并记录 - 只有当它以 主要组 开始时,我们才应该将其视为连续的,因此即使认为它是连续的,这里的第一个记录也应该被视为单独的
- 列表项
如果未作为主要组结束,则不要合并,
- 列表项
如果有一天的间隔就不要合并
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
这主要使用 运行 总计的技巧,用它创建分组,然后用于确定是否可以合并行。
我有一个要求,我需要合并连续的记录,属于特定类型的组和其他一些条件。
- 列表项
要合并记录 - 只有当它以 主要组 开始时,我们才应该将其视为连续的,因此即使认为它是连续的,这里的第一个记录也应该被视为单独的
- 列表项
如果未作为主要组结束,则不要合并,
- 列表项
如果有一天的间隔就不要合并
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
这主要使用 运行 总计的技巧,用它创建分组,然后用于确定是否可以合并行。