如何解决从一个表中拆分时间条目,具体取决于另一个表
我有一个表,其中包含某些过程的开始和结束时间,第二个表中包含休息的开始和结束时间。我想为每个进程生成一个包含单个条目的新视图,而不会出现中断。我将尝试通过一个示例进行解释:
表一:
Process | START | STOP
Process xy | 2020-08-18 08:00:00 | 2020-08-18 10:00:00
表二:
| pause_START | pause_STOP
Break 1 | 2020-08-18 08:20:00 | 2020-08-18 08:40:00
Break 2 | 2020-08-18 09:20:00 | 2020-08-18 09:40:00
所需的输出:
Process | START | STOP
Process xy | 2020-08-18 08:00:00 | 2020-08-18 08:20:00
Process xy | 2020-08-18 08:40:00 | 2020-08-18 09:20:00
Process xy | 2020-08-18 09:40:00 | 2020-08-18 10:00:00
或视觉上:
如果每个条目最多有一个一个中断(通过选择和联合的组合),我设法做到了,但是如果每个进程有一个以上的中断,这将不起作用。
首先,我像这样创建View1
:
SELECT TOP (100) PERCENT dbo.Table1.Process,dbo.Table1.START,dbo.Table1.STOP FROM dbo.Table1 LEFT OUTER JOIN dbo.Table2 ON dbo.Table1.START <= dbo.Table2.pause_START AND (dbo.Table1.STOP >= dbo.Table2.pause_START OR dbo.Table1.STOP IS NULL) AND ((dbo.Table1.STOP >= dbo.Table2.pause_STOP OR dbo.Table1.STOP IS NULL) AND dbo.Table1.START <= dbo.Table2.pause_STOP OR dbo.Table2.pause_STOP IS NULL) WHERE (dbo.Table1.START > CAST(DATEADD(DAY,- 1,GETDATE()) AS DATE)) OR (dbo.Table1.STOP IS NOT NULL)
然后我得到了这样的间隔:
SELECT dbo.View1.Process,dbo.View1.START AS 'start',View1_1.pause_START AS 'stop',dbo.View1.TAB,dbo.View1.MA_ID FROM dbo.View1 INNER JOIN dbo.View1 AS View1_1 ON dbo.View1.Process = View1_1.Process AND dbo.View1.TAB = View1_1.TAB WHERE (View1_1.pause_START IS NOT NULL) UNION SELECT dbo.View1.Process,dbo.View1.pause_STOP,View1_1.STOP,dbo.View1.START,dbo.View1.MA_ID FROM dbo.View1 INNER JOIN dbo.View1 AS View1_1 ON dbo.View1.Process = View1_1.Process AND dbo.View1.TAB = View1_1.TAB WHERE (View1_1.pause_START IS NULL)
但是正如我所提到的,每个间隔不能超过一个中断。
任何帮助将不胜感激!
解决方法
假设中断不重叠并且始终在开始和停止之间(如您的示例所示),然后使用union all
组合不同的时间段:
-- first record
select t1.process,t1.start,min(t2.start) as end
from table1 t1 cross join
table2 t2
group by t1.process,t1.start
union all
-- all the breaks
select t1.process,t2.start,t2.end
from table1 t1 cross join
table2 t2
union all
-- all the in-between times
select process,starttime,endtime
from (select t1.process,t2.end as starttime,lead(t2.start) over (partition by t1.process order by t1.start) as endtime
from table1 t1 cross join
table2 t2
) t
where endtime is not null
union all
-- last record
select t1.process,max(t2.end),t1.end
from table1 t1 cross join
table2 t2
group by t1.process,t1.start;
这应该适用于您所查询的数据。您的实际情况可能更复杂(重叠中断,table2
中每个进程有多行或其他内容)。如果是这样,请问一个 new 问题,并提供适当的示例数据,所需的结果和解释。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。