tsql - 在时间间隔岛上分配多个事件持续时间

时间:2015-12-01 13:13:23

标签: sql sql-server-2012 intervals

在sql server 2012中,我需要在多个(岛)时间间隔内分发一些事件持续时间。

该场景是一个制造环境,其中有许多生产周期'在整个班次期间定义。这些是岛屿,可能不是连续的。

在班次期间,由于不同的原因,可能会出现多个停机时间,并且这些停机时间仅作为持续时间(没有参考时间戳)被捕获,并且与它们发生的转变有外键关系。

我需要能够在生产时间段内分发持续时间记录,以便打包时间段短于句点,并且分段持续时间长于句点。

示例数据

生产期'群岛'

Idx  StartTime                 EndTime
1    2015-12-01 01:00:00.000   2015-12-01 02:00:00.000
3    2015-12-01 03:00:00.000   2015-12-01 04:00:00.000
6    2015-12-01 06:00:00.000   2015-12-01 08:00:00.000
8    2015-12-01 10:00:00.000   2015-12-01 11:00:00.000
10   2015-12-01 12:00:00.000   2015-12-01 14:00:00.000
12   2015-12-01 15:00:00.000   2015-12-01 16:00:00.000

持续时间

Idx DurationMins
1   90
2   60
3   150
4   30

我需要在上述期间分配持续时间,以便结果集如下(或类似)。由于持续时间与实际时间没有关系,因此订单并不重要。 (只是它们发生在生产时间岛屿的某个时间)。对两个时期和时间进行排序甚至可以接受。持续时间desc的持续时间,以便可能减少分裂事件的数量。我需要将持续时间转换为时间间隔的原因是我需要在时间轴图表报告中显示此数据以及其他时间敏感数据,因此需要将持续时间事件设置为一些开始和时间。结束时间戳。

期望的结果集:

Dur       Packed Period
Idx  Dur  Dur    Idx     StartTime                EndTime         
1    90    60     1      2015-12-01 01:00:00.000  2015-12-01 02:00:00.000
1    90    30     3      2015-12-01 03:00:00.000  2015-12-01 03:30:00.000
2    60    30     3      2015-12-01 03:30:00.000  2015-12-01 04:00:00.000
2    60    30     6      2015-12-01 06:00:00.000  2015-12-01 06:30:00.000
3    150   90     6      2015-12-01 06:30:00.000  2015-12-01 08:00:00.000
3    150   60     8      2015-12-01 10:00:00.000  2015-12-01 11:00:00.000
4    30    30     10     2015-12-01 12:00:00.000  2015-12-01 12:30:00.000

因此,在上面的例子中,4个持续时间记录将被分成7个时间间隔记录,如上所述。我尝试了一些不同的方法,包括递归cte,self join和amp;交叉适用但尚未能够提出解决方案。

这似乎是一个间隔打包问题,增加了分发持续时间的复杂性。

任何人都可以提供任何帮助或指导,我们将不胜感激。

0 个答案:

没有答案