无法为下一阶段获得正确的EndTime

时间:2014-07-18 16:09:13

标签: sql sql-server-2008 tsql

我试图根据我的历史数据得出一个活动“InProgress”多长时间。每个历史记录都包含StartTime和活动的“阶段”。 阶段流程如下:

Ready
InProgress
Completed

还有一个名为“OnHold”的舞台,它将活动置于保持状态。在计算活动“InProgress”的时间时,我需要减去“OnHold”的时间量。

在给定的例子中,您将看到名为“MA50665”的活动在“2014-07-17 13:08:04.013”进入“InProgress”,然后在“2014-07-17 13:12:14.473”暂停“这大约是4分钟左右。然后它在“2014-07-17 13:22:45.503”再次进入“InProgress”,并在“2014-07-17 13:33:38.513”左右完成,大约在11分钟左右。这意味着MA50665是InProgress大约11 + 4 = 15分钟。

我的查询让我接近我正在寻找的东西。它给了我两个“MA50665”的记录,我期待这两个记录的 EndTime来到“2014-07-17 13:33:38.513”这是不正确的。

对于开始时间“2014-07-17 13:08:04.013”,EndTime应该是“2014-07-17 13:12:14.473”,因为这是“InProgress”阶段结束的时间。对于第二行,StartTime和EndTime是正确的。

如何在查询中说明从该活动的下一个历史记录行中获取舞台的结束时间?我无法在联接中硬编码“+1”。

以下是表架构和查询的SQLFiddle:http://sqlfiddle.com/#!3/37ef3/4

1 个答案:

答案 0 :(得分:0)

我想我在你的例子中看到一个重复的行,你说它有效,但其中有“+1”。记录5& 6,似乎是相同但有不同的结束时间。假设你是正确的,这是对查询的修复。

    SELECT ROW_NUMBER()OVER(ORDER BY T1.Seqid, T1.Historyid)Rnumber, 
     T1.Srid, 
     T1.Activityid, 
     T1.Seqid, 
     T1.Currentactstatus, 
     T1.Previousactstatus, 
     T1.Timechanged Statusstarttime, 
     Endtimehist.Timechanged Statusendtime
 FROM T1
     LEFT JOIN T1 Endtimehist ON T1.Srid = Endtimehist.Srid
                        AND T1.Activityid = Endtimehist.Activityid
                        AND T1.Currentactstatus = Endtimehist.Previousactstatus
WHERE T1.SRId = 'SR50660'
  AND T1.Currentactstatus = 'InProgress'
   AND T1.Previousactstatus = 'Ready'
  AND T1.Historyid < Endtimehist.Historyid --This works but i cannot hard code +1 here as history ids may appear in the random incrementing order
ORDER BY T1.SRId DESC, T1.SeqId, T1.HistoryId