Sql 为特定子总体创建连续注册孤岛
我的最终目标是为2019和2020日历年的单个亚群体的每个客户ID创建连续注册日的孤岛:“成人扩展”。一个CLIENTID可以在一个日历年中与多个子群体相关联,但不能同时与多个子群体相关联。注册中没有重叠。我的数据可以追溯到2016年,但我只对2019年和2020年感兴趣。数据的结构是,每一行都是一个单独的注册周期,具有注册的开始日期和结束日期,与一个子群体相关联 为了更好地说明我的目标,我在下面提供了一些虚拟数据和期望的输出:Sql 为特定子总体创建连续注册孤岛,sql,sql-server,tsql,gaps-and-islands,Sql,Sql Server,Tsql,Gaps And Islands,我的最终目标是为2019和2020日历年的单个亚群体的每个客户ID创建连续注册日的孤岛:“成人扩展”。一个CLIENTID可以在一个日历年中与多个子群体相关联,但不能同时与多个子群体相关联。注册中没有重叠。我的数据可以追溯到2016年,但我只对2019年和2020年感兴趣。数据的结构是,每一行都是一个单独的注册周期,具有注册的开始日期和结束日期,与一个子群体相关联 为了更好地说明我的目标,我在下面提供了一些虚拟数据和期望的输出: CREATE TABLE #t ( CLIENTID NVARCH
CREATE TABLE #t (
CLIENTID NVARCHAR(9),
DEMONSTRATION_POPULATION NVARCHAR(30),
ELIGBEGIN DATE,
ELIGEND DATE,
AGE INT
)
INSERT INTO #t
VALUES
('123456789', 'Adult Expansion', '2019-12-16', '2019-12-31', 52)
, ('123456789', 'Adult Expansion', '2020-01-01', '2020-01-15', 52)
, ('123456789', 'Adult Expansion', '2020-03-01', '2020-03-31', 52)
, ('123456789', 'Adult Expansion', '2020-04-01', '2020-04-30', 52)
, ('123456789', 'Adult Expansion', '2020-05-01', '2020-05-31', 52)
, ('123456789', 'Adult Expansion', '2020-06-01', '2020-06-30', 52)
, ('123456789', 'Adult Expansion', '2020-07-01', '2020-07-31', 52)
, ('123456789', 'Adult Expansion', '2020-08-01', '2020-08-31', 52)
, ('123456789', 'Adult Expansion', '2020-09-01', '2020-09-30', 52)
, ('123456789', 'Adult Expansion', '2020-10-01', '2020-10-31', 52)
, ('123456789', 'Adult Expansion', '2020-11-01', '2020-11-30', 52)
, ('123456789', 'Adult Expansion', '2020-12-01', '2020-12-31', 52)
------------------------NEW CLIENTID-----------------------------
,('012345678', 'Demonstration Population #3', '2019-10-01', '2019-10-31', 52)
,('012345678', 'Demonstration Population #3', '2019-11-01', '2019-11-30', 52)
,('012345678', 'Demonstration Population #3', '2019-12-01', '2019-12-31', 52)
,('012345678', 'Demonstration Population #3', '2020-01-01', '2020-01-31', 52)
,('012345678', 'Adult Expansion', '2020-02-01', '2020-02-28', 52)
,('012345678', 'Demonstration Population #3', '2020-02-29', '2020-02-29', 52)
,('012345678', 'Adult Expansion', '2020-03-01', '2020-03-31', 52)
,('012345678', 'Adult Expansion', '2020-04-01', '2020-04-30', 52)
,('012345678', 'Adult Expansion', '2020-05-01', '2020-05-31', 52)
,('012345678', 'Adult Expansion', '2020-06-01', '2020-06-30', 52)
,('012345678', 'Adult Expansion', '2020-07-01', '2020-07-31', 52)
,('012345678', 'Adult Expansion', '2020-08-01', '2020-08-31', 52)
,('012345678', 'Adult Expansion', '2020-09-01', '2020-09-30', 52)
,('012345678', 'Adult Expansion', '2020-10-01', '2020-10-31', 52)
,('012345678', 'Adult Expansion', '2020-11-01', '2020-11-30', 52)
,('012345678', 'Adult Expansion', '2020-12-01', '2020-12-31', 52)
---------------------------NEW CLIENTID---------------------------
,('020234587', 'Adult Expansion', '2019-06-01', '2019-06-30', 36)
,('020234587', 'Adult Expansion', '2019-08-01', '2019-08-31', 36)
,('020234587', 'Adult Expansion', '2019-09-01', '2019-09-30', 36)
,('020234587', 'Adult Expansion', '2019-10-01', '2019-10-31', 36)
,('020234587', 'Adult Expansion', '2019-11-01', '2019-11-30', 36)
,('020234587', 'Non-1115-Waiver', '2019-12-01', '2019-12-31', 36)
,('020234587', 'Non-1115-Waiver', '2020-01-01', '2020-01-31', 36)
,('020234587', 'Non-1115-Waiver', '2020-02-01', '2020-02-29', 36)
期望输出:
客户
年龄
埃利格贝金
艾利根德
序列号
123456789
52
2019-12-19
2019-12-31
1.
123456789
52
2020-01-01
2020-01-15
2.
123456789
52
2020-03-01
2020-12-31
3.
012345678
52
2020-02-01
2020-28-20
1.
012345678
52
2020-03-01
2020-03-31
2.
020234587
36
2019-06-01
2019-06-30
1.
020234587
36
2019-08-01
2019-11-30
2.
下面是一个使用间隙和孤岛方法的解决方案: ;与prevNextCTE 像 选择CLIENTID, 人口,, 埃利格贝金, 艾利根德, 年龄 -将上一条记录的年份与当前记录的年份进行比较,以便在年末创建拆分 当YearLageligen,1超过按CLIENTID按ELIGBEGIN排序的分区=YEARELIGBEGIN时的情况 然后根据ELIGBEGIN的CLIENTID顺序划分Lageligend1 以先例结束, -将下一条记录的年份与当前记录的年份进行比较,以便在年末创建拆分 当YEARLEADELIGBEGIN,1除以CLIENTID ORDER BY ELIGBEGIN=YEARELIGEND时的情况 然后将ELIGBEGIN,1按ELIGBEGIN的CLIENTID顺序引导到分区上 以nextELIGBEGIN结束 从t 其中,人口=成人扩张 ,斯达特岛 像 选择*, 按CLIENTID按ELIGBEGIN按顺序按顺序按分区的行号 来自Prevenxtte 其中preveligen为NULL 或DATEADDDAY,1,Preveligen