Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 server 基于日期范围压缩数据_Sql Server_Common Table Expression - Fatal编程技术网

Sql server 基于日期范围压缩数据

Sql server 基于日期范围压缩数据,sql-server,common-table-expression,Sql Server,Common Table Expression,我有以下格式的数据: Vbeln在日期范围Begda和Endda上重复。对于不同的Begda和Endda范围,PernrZa和PernrZb会发生变化(但在未来的日期范围内,它可能会返回到以前的状态。日期范围是连续的 我需要压缩日期范围并构建一个连续的日期范围 CREATE TABLE #Data ( Vbeln NVARCHAR(12) , Begda NVARCHAR(10) -- but can be converted to

我有以下格式的数据:

Vbeln在日期范围Begda和Endda上重复。对于不同的Begda和Endda范围,PernrZa和PernrZb会发生变化(但在未来的日期范围内,它可能会返回到以前的状态。日期范围是连续的

我需要压缩日期范围并构建一个连续的日期范围

CREATE TABLE #Data (
   Vbeln                NVARCHAR(12)
   , Begda           NVARCHAR(10) -- but can be converted to datetime2
   , Endda           NVARCHAR(10) -- but can be converted to datetime2
   , PernrZa          NVARCHAR(10)
   , PernrZb         NVARCHAR(10)
)
INSERT INTO #Data (Vbeln, Begda, Endda, PernrZa, PernrZb)
VALUES
('3000080085','19000101','20160411','1111111','1111111')
,('3000080085','20160412','20160418','1521708','1895971')
,('3000080085','20160419','20160516','1521708','1895971')
,('3000080085','20160517','20160519','1521708','1895971')
,('3000080085','20160520','20160523','1521708','1895971')
,('3000080085','20160524','20160606','1521708','2304882')
,('3000080085','20160607','20160628','1521708','1895971')
,('3000080085','20160629','20160826','1521708','2304882')
,('3000080085','20160827','20160909','1521708','2304882')
,('3000080085','20160910','20161011','1579311','2304882')
,('3000080085','20161012','20161201','1579311','2889814')
,('3000080085','20161202','20161225','1579311','2889814')
,('3000080085','20161226','99991231','1111111','1111111')
,('2000094798','19000101','20121029','1315393','1315393')
,('2000094798','20121030','20121224','1315393','1315393')
,('2000094798','20121225','20130331','1315393','1315393')
,('2000094798','20130401','20131003','1315393','1315393')
,('2000094798','20131004','20140429','1315393','1315393')
,('2000094798','20140430','20150326','1315393','1315393')
,('2000094798','20150327','20160826','1315393','1315393')
,('2000094798','20160827','20160909','1315393','1315393')
,('2000094798','20160910','20161201','1315393','1315393')
,('2000094798','20161202','99991231','1315393','1315393')
我希望输出如下所示:

'3000080085','19000101','20160412','1111111','1111111'
'3000080085','20160412','20160524','1521708','1895971'
'3000080085','20160524','20160607','1521708','2304882'
'3000080085','20160607','20160629','1521708','1895971'
'3000080085','20160629','20160910','1521708','2304882'
'3000080085','20160910','20161012','1579311','2304882'
'3000080085','20161012','20161226','1579311','2889814'
'3000080085','20161226','99991231','1111111','1111111'
'2000094798','19000101','99991231','1315393','1315393'

您可以使用
lag()
识别组:

请注意,这将提前一天给出
enda
,因为原始数据就是这样构造的。如果您确实希望,可以在结束日期中添加一个


是一个rextester。

谢谢,Gordon。它没有给出我想要的输出。对于Vbeln 2000094798,我应该只看到一条记录,而对于另一条,我应该看到8行,每行从1900到20009999@EnnSpace…这不是rextester对您提供的数据所做的吗?如果您查看300008085的最后一条记录,它是wrong.1579311、2889814值的范围应以“20161226”结束。从20161226到99991231,1111111的新系列应从1111111111开始。这与rextester中的差不多。唯一的区别是,结束日期提前一天,因为它与数据匹配,而不是增加额外的一天。
select vbeln, PernrZa, PernrZb, min(begda), max(endda)
from (select d.*,
             sum(case when prev_enda = dateadd(day, -1, begda) then 0 else 1 end) over
                 (partition by vbeln, PernrZa, PernrZb order by begda) as grp
      from (select d.*,
                   lag(endda) over (partition by vbeln, PernrZa, PernrZb order by begda) as prev_enda             
            from #data d
           ) d
     ) d
group by vbeln, PernrZa, PernrZb, grp;