2013-05-06 45 views
0

UPDATE:發佈後,我很快就想到了......基本上,我使用ROW_NUMBER根據TaskId ORDER BY TaskAssigmentId`創建了TaskAssignments的子分區。多謝你們。訪問表的下一個/上一個行的T-SQL

假設我建立一個系統來跟蹤簡單的任務分配與下面的模式:

Tasks: 
TaskId   CurrentlyAssignedTo TaskAddedTime    TaskEndTime 
A    FooBar    2013-05-03 23:28:32.060 2013-05-07 10:12:32.060 
B    Bob     2013-05-03 20:12:32.060 NULL 

TaskAssignments: 
TaskAssignmentId TaskId AssignedTo StartTime 
1    A  Foo   2013-05-03 23:28:32.060 
2    A  Bar   2013-05-04 20:12:32.060 
3    A  FooBar  2013-05-05 10:12:32.060 
4    B  Alice  2013-05-03 20:12:32.060 
5    B  Bob   2013-05-06 10:12:32.060 

Tasks包含任務的當前信息。一個特定的任務(A或B)可以分配給多個工作人員(一次一個)。每次發生任務(包括創建時間)時,都會向表表中添加一個條目,以指定任務分配給誰以及在什麼時間。當任務被重新分配時,Tasks中的CurrentlyAssignedTo字段被當前工作者更新。當任務完全完成時,TaskEndTime字段在Tasks表中更新。 TaskAssignmentId是一個增量索引。

就這樣,我想建立一個查詢/視圖輸出是這樣的:

VwTaskBreakDown: 
TaskId AssignedTo StartTime     EndTime 
A   Foo   2013-05-03 23:28:32.060 2013-05-04 20:12:32.060 
A   Bar   2013-05-04 20:12:32.060 2013-05-05 10:12:32.060 
A   FooBar  2013-05-05 10:12:32.060 2013-05-07 10:12:32.060 
B   Alice   2013-05-03 20:12:32.060 2013-05-06 10:12:32.060 
B   Bob   2013-05-06 10:12:32.060 NULL 

就某一特定任務,分配的EndTime是下一個任務的StartTime。如果沒有下一個任務,EndTime來自TasksTaskEndTime

任何暗示這可以做得很好嗎?

Disclaimer:我沒有任何以前的經驗與SQL

感謝, Noobie

回答

0

你可以嘗試這樣的...

Select TaskId,AssignedTo,StartTime,cOALESCE(
    (sELECT MIN(StartTime) FROM tABLENAME 
A WHERE A.TaskId=t.TaskId AND a.StartTime>t.StartTime), 
    (sELECT TaskEndTime FROM T1 B WHERE B.TaskId=T.TaskId AND B.CurrentlyAssignedTo=T.AssignedTo) 
)AS eNDtIME 
FROM tABLEnAME 
T 

Sql Fiddle Demo