Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.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
Tsql 将帐户日期列表透视到缺少日期的帐户开始和结束日期_Tsql_Gaps And Islands - Fatal编程技术网

Tsql 将帐户日期列表透视到缺少日期的帐户开始和结束日期

Tsql 将帐户日期列表透视到缺少日期的帐户开始和结束日期,tsql,gaps-and-islands,Tsql,Gaps And Islands,我需要转换帐户活动日期列表,以提供每个日期序列的活动开始和结束日期以及日期之间的日期。例如,这是两个帐户的活动日期列表 这是所需的结果集,显示了日期序列的开始和结束以及这些日期之间的天数 然而,如何真正做到这一点一直是个谜。以前有人这样做过吗 下面是一些带有示例数据的代码 If Object_Id('dbo.account_active') Is Not Null 删除表dbo.account\u active 创建表dbo.account\u活动( 账户有效id内部标识(1,1), 帐户

我需要转换帐户活动日期列表,以提供每个日期序列的活动开始和结束日期以及日期之间的日期。例如,这是两个帐户的活动日期列表

这是所需的结果集,显示了日期序列的开始和结束以及这些日期之间的天数

然而,如何真正做到这一点一直是个谜。以前有人这样做过吗

下面是一些带有示例数据的代码

If Object_Id('dbo.account_active') Is Not Null
删除表dbo.account\u active

创建表dbo.account\u活动( 账户有效id内部标识(1,1), 帐户id int, 有效日期)

插入dbo.account\u活动( 帐户id, 活动日期) 价值观 (1,'2019-01-01'), (1,'2019-01-02'), (1,'2019-01-03'), (1,'2019-01-06'), (1,'2019-01-07'), (1,'2019-01-08'), (1,'2019-01-09'), (1,'2019-01-10'), (1,'2019-01-11'), (1,'2019-01-28'), (1,'2019-01-29'), (1,'2019-01-30'), (1,'2019-01-31'), (2,'2019-01-16'), (2,'2019-01-25'), (2,'2019-01-26');

挑选 aa.账户号, 活动日期 从…起
dbo.account_作为aa激活

这是一个缺口和孤岛问题

也许这会有所帮助

示例

Select Account_ID
      ,Active_Date_Start = min(Active_Date)
      ,Active_Date_End   = max(Active_Date)
      ,Days_Active       = DateDiff(DAY,min(Active_Date),max(Active_Date))+1
 From  (
        Select *
              ,Grp = DateDiff(DAY,'1900-01-01',active_date)
                     - Dense_Rank() over (Partition By Account_id Order by Active_Date)
         From  account_active
       ) A
 Group By Account_id,Grp
 Order by Account_id,min(Active_Date)
返回

Account_ID  Active_Date_Start   Active_Date_End Days_Active
1           2019-01-01          2019-01-03          3
1           2019-01-06          2019-01-11          6
1           2019-01-28          2019-01-31          4
2           2019-01-16          2019-01-16          1
2           2019-01-25          2019-01-26          2

这很有效,尤其是在没有滞后的旧环境中。。非常感谢。@user2466387乐于帮助我开始使用一个大数据集进行测试,发现当帐户id存在重复的活动日期时,上述方法不起作用。我将很快发布我发现的解决方案。这些要求并不重要。只是日期之间的日子。我更新了原来的帖子,以更准确地反映这一点。