T-SQL访问表的下一行/上一行

时间:2013-05-06 02:43:47

标签: sql tsql sql-view row-number

UPDATE:我在发布此消息后很快就明白了这一点......基本上我使用ROW_NUMBER根据TaskId ORDER BY TaskAssigmentId`创建了TaskAssignments的子分区。谢谢你们。

假设我使用以下模式构建一个系统来跟踪简单的任务分配:

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)分配给多个工作人员(一次一个)。每次分配发生时(包括创建时间),都会在TaskAssignments表中添加一个条目,指定分配任务的人员以及分配给谁。重新分配任务后,CurrentlyAssignedTo中的Tasks字段将更新为当前工作人员。任务完全完成后,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来自表TaskEndTime的{​​{1}}。

有关如何做到这一点的任何提示吗?

Tasks:我之前没有使用过SQL的经验

谢谢, Noobie

1 个答案:

答案 0 :(得分: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