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

Posted

技术标签:

【中文标题】将帐户日期列表透视到缺少日期的帐户开始日期和结束日期【英文标题】:Pivot account date list to account start and end dates with missing dates 【发布时间】:2019-07-03 15:11:51 【问题描述】:

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

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

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

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

If Object_Id('dbo.account_active') Is Not Null

删除表 dbo.account_active;

创建表 dbo.account_active( account_active_id int 身份(1,1), account_id 整数, active_date 日期);

插入到 dbo.account_active( 帐户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.account_id, aa.active_date 从 dbo.account_active 作为aa;

【问题讨论】:

【参考方案1】:

这是一个差距和岛屿问题

也许这会有所帮助。

示例

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

【讨论】:

那行得通,尤其是在 LAG 不可用的旧环境中。非常感谢。 @user2466387 乐于助人 我开始使用大型数据集进行测试,发现当 account_id 有重复的 active_dates 时,上述方法不起作用。我会尽快发布我发现的解决方案。 要求不算数。只是日期之间的日子。我更新了原始帖子以更准确地反映这一点。

以上是关于将帐户日期列表透视到缺少日期的帐户开始日期和结束日期的主要内容,如果未能解决你的问题,请参考以下文章

查找在 SQL Server 2014 中拥有多个帐户的客户的真正开始结束日期

如何生成列表而忽略日期不符合我要查找的范围的记录?

添加缺失的报告日期,不包括具有指定值的周末

如何获取帐户在两个日期之间进行的转发列表?

结束日期不能小于开始日期啥意思

按日期不等的日期合并数据框