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 列の開始ステップ レコードは常に null です。
  • 開始ステップは、特定の注文の New 列の値と 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 を複数回通過します)。

Order/Step でグループ化し、各ペアの合計時間を表示するには、代わりに次の 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 に答える