0

UPDATE:我在发布此消息后不久就发现了这一点……本质上,我曾经ROW_NUMBER根据 TaskId TaskAssigmentId 创建了 TaskAssignments 的子分区ORDER BY。多谢你们。

假设我构建了一个系统来跟踪具有以下架构的简单任务分配:

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字段 inTasks将使用当前工作人员进行更新。当任务完全完成时,表TaskEndTime中的字段会更新TasksTaskAssignmentId是增量索引。

有了它,我想构建一个查询/视图来输出如下内容:

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来自TaskEndTimetable Tasks

关于如何很好地做到这一点的任何提示?

Disclaimer: 我之前没有任何 SQL 经验

谢谢,努比

4

1 回答 1

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 小提琴演示

于 2013-05-06T03:47:32.960 回答