有一个包含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


阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6