岛屿的SQL时间包装

Aar*_*ron 1 sql gaps-and-islands

我有一个类似于这个的SQL表:

EmpNo      StartTime               EndTime 
------------------------------------------
1          7:00                    7:30
1          7:15                    7:45
1          13:40                   15:00
2          8:00                    14:00
2          8:30                    9:00
3          10:30                   14:30
Run Code Online (Sandbox Code Playgroud)

我已经看过很多例子,你可以找到所有东西之间的差距,以及很多可以为所有东西打包重叠的例子.但我希望能够将这些用户分开.

遗憾的是,我需要一个纯SQL解决方案.

最后,我想回复:

EmpNo      StartTime               EndTime 
------------------------------------------
1          7:00                    7:45
1          13:40                   15:00
2          8:00                    14:00
3          10:30                   14:30
Run Code Online (Sandbox Code Playgroud)

这看起来很简单,我刚刚花了最后一天试图搞清楚,并且提出的很少.这里的任何列都不会为NULL,您可以假设可能存在重复或0的间隙.

我知道这是典型的岛屿问题,但到目前为止我看到的解决方案对于保持单独的ID分组并不是非常友好

Gor*_*off 6

"纯SQL"一定会支持lag(),lead()以及累积和功能,因为这些都是标准的一部分.这是使用标准SQL的解决方案:

select EmpNo, min(StartTime) as StartTime, max(EndTime) as EndTime
from (select t.*, sum(StartGroup) over (partition by EmpNo order by StartTime) as grp
      from (select t.*,
                   (case when StartTime <= lag(EndTime) over (partition by EmpNo order by StartTime)
                         then 0
                         else 1
                    end) as StartGroup
            from table t 
           ) t
     ) t
group by EmpNo, grp;
Run Code Online (Sandbox Code Playgroud)

如果您的数据库不支持这些,则可以使用相关子查询实现相同的逻辑.