0

次の SQL クエリがあります。

SELECT t.trans_id, t.business_process_id, tsp.status, tsp.timestamp
  FROM tran_stat_p tsp, tran t
 WHERE t.trans_id = tsp.trans_id
       AND tsp.timestamp BETWEEN '1-jan-2008' AND SYSDATE
       AND t.business_process_id = 'ABC01'

次のようなデータを出力します。

trans_ID business_process_id status timestamp
14444400 ABC01 F 6/5/2008 12:37:36 PM
14444400 ABC01 W 6/6/2008 1:37:36 PM
14444400 ABC01 S 6/7/2008 2:37:36 PM
14444400 ABC01 P 6/8/2008 3:37:36 PM
14444401 ABC01 F 6/5/2008 12:37:36 PM
14444401 ABC01 W 6/6/2008 1:37:36 PM
14444401 ABC01 S 6/7/2008 2:37:36 PM
14444401 ABC01 P 6/8/2008 3:37:36 PM

上記に加えて、一意のすべてのステータス W&F、S&W、P&S 間の時間差 (日数) を計算する列を追加したいと思いますtrans_id

アイデアは、トランザクションが最終的にステータス「P」に処理される前に、トランザクションがさまざまなステータスに留まっている時間を把握することです。トランザクションのライフ サイクルは、F -> W -> S -> P の順です。ここで、F は最初のステータス、P は最終ステータスです。

誰でも助けることができますか?前もって感謝します。

4

3 に答える 3

1

を使用LEADして、次のタイムスタンプ値を取得し、すべてのステータス (F、W、および S) の残り時間を計算し、その間TRUNCの日数を整数として計算できます。

SELECT t."trans_ID", t."business_process_id", tsp."status", tsp."timestamp", 
       LEAD("timestamp", 1) OVER (
                  PARTITION BY tsp."trans_ID" 
                  ORDER BY "timestamp") AS "next_timestamp",
       trunc(LEAD("timestamp", 1) OVER (
                        PARTITION BY tsp."trans_ID" 
                        ORDER BY "timestamp")) - trunc(tsp."timestamp") as "Days"
  FROM tran t
INNER JOIN tran_stat_p tsp ON t."trans_ID" = tsp."trans_ID" 
       AND tsp."timestamp" BETWEEN '01-jan-2008 12:00:00 AM' AND SYSDATE
WHERE t."business_process_id" = 'ABC01'

SQLFIDDLE を参照してください: http://www.sqlfiddle.com/#!4/04633/49/0

于 2013-08-20T18:59:54.237 に答える