递归循环遍历SQL表并根据“开始日期”和“结束日期”查找间隔

有一个包含employeeid,StartDateTime和EndDatetime的sql表,如下所示:

create table Sample(
  SNO INT,
  EmployeeID NVARCHAR(10),
  StartDateTime DATE,
  EndDateTime DATE
  )

  INSERT INTO Sample
VALUES
( 1, 'xyz', '2018-01-01', '2018-01-02' ), 
( 2, 'xyz', '2018-01-03', '2018-01-05' ), 
( 3, 'xyz', '2018-01-06', '2018-02-01' ), 
( 4, 'xyz', '2018-02-15', '2018-03-15' ), 
( 5, 'xyz', '2018-03-16', '2018-03-19' ),
( 6, 'abc', '2018-01-16', '2018-02-25' ),
( 7, 'abc', '2018-03-08', '2018-03-19' ),
( 8, 'abc', '2018-02-26', '2018-03-01' )

我希望结果显示为

EmployeeID  |  StartDateTime  |  EndDateTime
----------------------------------------------
   xyz      |  2018-01-01     |  2018-02-01
   xyz      |  2018-02-15     |  2018-03-19
   abc      |  2018-01-16     |  2018-03-01
   abc      |  2018-03-08     |  2018-03-19

基本上,我想以递归方式查看每个员工的记录,并确定Start和EndDates的连续性,并创建一组连续的日期记录。

我写的查询如下:

SELECT * FROM dbo.TestTable T1 LEFT JOIN dbo.TestTable t2 ON t2.EmpId = T1.EmpId
WHERE   t1.EndDate = DATEADD(DAY,-1,T2.startdate)

看看我是否可以从输出中解读一些寻找模式的东西。后来意识到通过上面的方法,我需要多次加入同一个表来获得我想要的输出。

此外,有一种情况是可能有多个员工记录,因此我需要有效的方法来获得所需的输出。

使用递归CTE获取所有相邻行,然后获取每个开始日期的最高结束日期,然后是每个结束日期的第一个开始日期。

;with cte as (
    select EmployeeID, StartDateTime, EndDateTime 
    from sample s
    union all
    select CTE.EmployeeID, CTE.StartDateTime, s.EndDateTime
    from sample s
    join cte on cte.EmployeeID=s.EmployeeID and s.StartDateTime=dateadd(d,1,CTE.EndDateTime)
)
select EmployeeID, Min(StartDateTime) as StartDateTime, EndDateTime from (
    select EmployeeID, StartDateTime, Max(EndDateTime) as EndDateTime from cte
    group by EmployeeID, StartDateTime
) q group by EmployeeID, EndDateTime
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值