我有一系列可能重叠的编号时间间隔。重要提示:没有两个间隔同时开始,开始间隔的时间是严格内插。用于在一系列重叠(时间)间隔内查找非重叠间隔的子系列的SQL查询
插图:
Task 1: 1111111
Task 2: 22222222222
Task 3: 333333333333333
Task 4: 444444
Task 5: 5555555
Task 6: 66
.
.
.
0 --- time axis --->
的间隔代表应该执行的任务。我正在寻找一个SQL查询,该查询选择可以执行的任务,给定的约束条件是只有一个任务可以在同一时间执行。第一项任务总是执行。接下来,从第一个任务完成后开始的所有任务开始执行最早开始的任务。等等。
结果:任务1,3和6可以执行。插图:
Task 1: 1111111 (yes, first)
Task 2: ----------- (no, task 1 is running when 2 begins)
Task 3: 333333333333333 (yes)
Task 4: ------ (no, task 3 is running when 4 begins)
Task 5: ------- (no, task 3 is running when 5 begins)
Task 6: 66 (yes)
.
.
.
0 --- time axis --->
用迭代法,该算法是容易的:在一个循环迭代过以升序记忆间隔的最后一个所选间隔的末尾。但是,我想问你一个SQL查询,可能使用窗口函数,可以执行例如。在Google BigQuery上。
的任务表的架构:
task_id: integer,
start_timestamp: integer,
duration_seconds: integer.
样本数据:
task_id,start_timestamp,duration_seconds
1,1,7
2,4,11
3,12,15
4,16,6
5,24,7
6,33,2
7,37,4
8,42,13
9,47,3
10,50,2
11,54,21
12,58,14
13,66,8
14,72,7
15,80,6
16,88,16
17,92,14
18,102,3
19,109,2
20,119,10
21,123,13
22,128,21
23,138,7
24,141,17
25,146,9
26,154,17
27,160,17
28,164,13
29,173,21
30,181,7
结果 - 所选择的任务:
1,3,6,7,8,12,14,15,16,19,20,23,25,27,30
样本数据的插图:
Task 1: 1111111 Task 2: 22222222222 Task 3: 333333333333333 Task 4: 444444 Task 5: 5555555 Task 6: 66 Task 7: 7777 Task 8: 8888888888888 Task 9: 999 Task 10: 10 Task 11: 11xxxxxxxxxxxxxxxxxxx Task 12: 12xxxxxxxxxxxx Task 13: 13xxxxxx Task 14: 14xxxxx Task 15: 15xxxx Task 16: 16xxxxxxxxxxxxxx Task 17: 17xxxxxxxxxxxx Task 18: 18x Task 19: 19 Task 20: 20xxxxxxxx Task 21: 21xxxxxxxxxxx Task 22: 22xxxxxxxxxxxxxxxxxxx Task 23: 23xxxxx Task 24: 24xxxxxxxxxxxxxxx Task 25: 25xxxxxxx Task 26: 26xxxxxxxxxxxxxxx Task 27: 27xxxxxxxxxxxxxxx Task 28: 28xxxxxxxxxxx Task 29: 29xxxxxxxxxxxxxxxxxxx Task 30: 30xxxxx
非常感谢您的帮助。
你能提供你有工作的SQL模式?你有开始日期时间和持续时间吗?或者你真的用数字开始索引和一个n位数的长字符串来表示任务持续时间? – 2014-10-30 20:06:41
选择...其中NOT EXISTS(具有重叠时间范围的任务) – 2014-10-30 21:23:24
@PatrickM我有开始时间戳和持续时间。我刚刚将模式附加到问题的文本中。 – Nathan 2014-10-30 21:28:11