我有一系列可能重疊的編號時間間隔。重要提示:沒有兩個間隔同時開始,開始間隔的時間是嚴格內插。用於在一系列重疊(時間)間隔內查找非重疊間隔的子系列的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