3

对于 sql 2008 中的审计表,我需要计算每个订单在给定步骤中的时间(表示为新列)。

 Old      New           Time Entered        Order Number
 NULL     Step 1        4/30/12 10:43       1C2014A
 Step 1   Step 2        5/2/12 10:17        1C2014A
 Step 2   Step 3        5/2/12 10:28        1C2014A
 Step 3   Step 4        5/2/12 11:14        1C2014A
 Step 4   Step 5        5/2/12 11:19        1C2014A
 Step 5   Step 9        5/3/12 11:23        1C2014A
 NULL     Step 1        5/18/12 15:49       1C2014B
 Step 1   Step 2        5/21/12 9:21        1C2014B
 Step 2   Step 3        5/21/12 9:34        1C2014B
 Step 3   Step 4        5/21/12 10:08       1C2014B
 Step 4   Step 5        5/21/12 10:09       1C2014B
 Step 5   Step 6        5/21/12 16:27       1C2014B
 Step 6   Step 9        5/21/12 18:07       1C2014B
 NULL     Step 1        6/12/12 10:28       1C2014C
 Step 1   Step 2        6/13/12 8:36        1C2014C
 Step 2   Step 3        6/13/12 9:05        1C2014C
 Step 3   Step 4        6/13/12 10:28       1C2014C
 Step 4   Step 6        6/13/12 10:50       1C2014C
 Step 6   Step 8        6/13/12 12:14       1C2014C
 Step 8   Step 4        6/13/12 15:13       1C2014C
 Step 4   Step 5        6/13/12 15:23       1C2014C
 Step 5   Step 8        6/13/12 15:30       1C2014C
 Step 8   Step 9        6/18/12 14:04       1C2014C
  • 这些步骤不需要是连续的,因此步骤 1 可以在步骤 5 之后发生。
  • 订单的记录不是按步骤或订单顺序存储的,而是根据输入的时间与其他订单混合。按订单号排序的样本数据然后是新的是不正常的,不能依赖。
  • 对于任何给定的顺序,每个步骤都可以重复,如果为一个顺序重复,则逐步求和。
  • Old 列中的起始步记录始终为空
  • 对于给定订单,起始步长计算为新列中的值与旧列中的值之间的时间差。

输出可以很简单:

Order Number   Step      Time in Step
1C2014A        Step 1    6:09
4

1 回答 1

2

这就是我想出的:

select 
  a1.OrderNumber,
  a1.New as Step, 
  datediff(second, a1.TimeEntered, isnull(a2.timeEntered,getdate()))
    as [Time in Step (seconds)]
from AuditTrail a1
left join AuditTrail a2
  on a1.New = a2.Old 
  and a1.OrderNumber = a2.OrderNumber

对于订单从未出过的步骤,时间计算到当前时刻 ( getdate())

在线工作示例:http ://www.sqlfiddle.com/#!3/fbaff/11

更新:

上述查询可以多次显示一个步骤(例如:订单多次1C2014C通过步骤 4)。

要按顺序/步骤分组并显示每对这样的总时间,请改用以下 SQL 语句:

select
  a1.OrderNumber,
  a1.New as Step, 
  sum(datediff(second, a1.TimeEntered, isnull(a2.timeEntered,getdate())))
    as [Total Time in Step (seconds)]
from AuditTrail a1
left join AuditTrail a2
  on a1.New = a2.Old 
  and a1.OrderNumber = a2.OrderNumber
group by a1.OrderNumber, a1.New
order by a1.OrderNumber

在线工作示例:http ://www.sqlfiddle.com/#!3/fbaff/14

于 2012-10-03T16:31:29.887 回答