2013-05-06 40 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