Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
岛屿的SQL时间打包_Sql_Gaps And Islands - Fatal编程技术网

岛屿的SQL时间打包

岛屿的SQL时间打包,sql,gaps-and-islands,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

我有一个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的分组并不十分友好。纯SQL肯定会支持滞后、超前和累积和函数,因为它们是标准的一部分。下面是一个使用标准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;

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

纯SQL肯定会支持滞后、超前和累积和函数,因为它们是标准的一部分。下面是一个使用标准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;

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

您使用的是什么数据库?您使用的是什么数据库?谢谢,我被子句和排序行号以及分隔时间开始和时间结束所困扰,我错过了这个。谢谢,我被子句和行数以及时间开始和时间结束的分隔所困扰,我错过了这个。