Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为特定子总体创建连续注册孤岛_Sql_Sql Server_Tsql_Gaps And Islands - Fatal编程技术网

Sql 为特定子总体创建连续注册孤岛

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

我的最终目标是为2019和2020日历年的单个亚群体的每个客户ID创建连续注册日的孤岛:“成人扩展”。一个CLIENTID可以在一个日历年中与多个子群体相关联,但不能同时与多个子群体相关联。注册中没有重叠。我的数据可以追溯到2016年,但我只对2019年和2020年感兴趣。数据的结构是,每一行都是一个单独的注册周期,具有注册的开始日期和结束日期,与一个子群体相关联

为了更好地说明我的目标,我在下面提供了一些虚拟数据和期望的输出:

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@DaleK,准备好了,谢谢你提醒我!嘿,艾德!谢谢你的代码,这看起来对我有用。在确认之前,我将对我的全部人口进行抽样检查。到目前为止,它使用的测试样本比我在这篇文章中包含的要大,所以看起来不错。非常感谢!