【发布时间】:2014-10-30 19:54:56
【问题描述】:
我有一系列可能重叠的编号时间间隔。重要提示:没有两个区间同时开始,开始区间的时间严格递增。
插图:
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
样本数据说明:
任务一:1111111 任务二:22222222222 任务三:333333333333333 任务 4:444444 任务五:5555555 任务 6:66 任务 7:7777 任务八:8888888888888 任务 9:999 任务 10:10 任务 11:11xxxxxxxxxxxxxxxxxxxxx 任务 12:12xxxxxxxxxxxx 任务 13:13xxxxxx 任务 14:14xxxx 任务 15:15xxxx 任务 16:16xxxxxxxxxxxxxxx 任务 17:17xxxxxxxxxxxx 任务 18:18 倍 任务 19:19 任务 20:20xxxxxxxx 任务 21:21xxxxxxxxxxxx 任务 22:22xxxxxxxxxxxxxxxxxx 任务 23:23xxxx 任务 24:24xxxxxxxxxxxxxxx 任务 25:25xxxxxxx 任务 26:26xxxxxxxxxxxxxxx 任务 27:27xxxxxxxxxxxxxxx 任务 28:28xxxxxxxxxxx 任务 29:29xxxxxxxxxxxxxxxxxxxxx 任务 30:30xxxx非常感谢您的帮助。
【问题讨论】:
-
您能否提供您必须使用的 SQL 架构?你有开始日期时间和持续时间吗?或者您是在使用数字开始索引和 n 位长字符串来指示任务持续时间?
-
Select ... where NOT EXISTS(时间范围重叠的任务)
-
@PatrickM 我有开始时间戳和持续时间。我刚刚将架构附加到问题的文本中。
-
@DariusX。你考虑任务的顺序了吗?例如,任务 3 被选中执行,尽管它与任务 2 和任务 4 有重叠。
-
请分享示例数据集,否则我将不得不创建一个来尝试此操作。分享更有效率。
标签: sql algorithm google-bigquery intervals date-range