SQL时间打包岛屿



我有一个类似这样的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

我见过很多例子,你可以找到所有东西之间的差距,还有很多例子,你可以打包所有东西的重叠部分。但是我希望能够根据用户来区分这些。

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

最后,我想返回:

EmpNo      StartTime               EndTime 
------------------------------------------
1          7:00                    7:45
1          13:40                   15:00
2          8:00                    14:00
3          10:30                   14:30

这似乎很简单,我只是花了最后一天的时间试图弄清楚,并没有想出什么。这里的任何列都不会为NULL,您可以假设可能存在重复或0的空白。

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

"Pure 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;

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

相关内容

  • 没有找到相关文章

最新更新