将帐户日期列表设置为缺少日期的帐户开始和结束日期

时间:2019-07-03 15:11:51

标签: tsql gaps-and-islands

我有此要求,以转换帐户有效日期列表,以提供每个日期序列和日期之间的日期的有效开始日期和结束日期。例如,这是两个帐户的有效日期列表。

List of active dates

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

Results requirement

但是,如何真正做到这一点一直令人困惑。有人做过吗?

这里有一些带有示例数据的代码。

*b = a

拖放表格dbo.account_active;

创建表dbo.account_active(     account_active_id int Identity(1,1),     account_id int,     active_date日期);

插入dbo.account_active(     帐户ID,     active_date) 价值观     (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.account_id,     aa.active_date 从     dbo.account_active as aa;

1 个答案:

答案 0 :(得分:3)

这是一个差距和孤岛问题

也许这会有所帮助。

示例

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