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存在重复的活动日期时,上述方法不起作用。我将很快发布我发现的解决方案。这些要求并不重要。只是日期之间的日子。我更新了原来的帖子,以更准确地反映这一点。