2017-11-17 13 views
0

テーブルの2つの行の時間差を、テーブルの別のフィールドの値に基づいて計算するにはどうすればよいですか。 表(簡略化)は次のようになります。隣接していない2つの行の差を計算する

Unit Date    Status 
0001 17.11.2017 09:52 INSPECTED 
0001 17.11.2017 09:48 CLEAN 
0001 17.11.2017 09:45 CLEANING 
0001 17.11.2017 09:43 DIRTY 
0001 16.11.2017 14:55 INSPECTED 
0001 16.11.2017 14:54 CLEAN 
0001 16.11.2017 12:54 CLEANING 
0001 16.11.2017 12:22 DIRTY 
0001 16.11.2017 12:20 CLEAN 
0001 15.11.2017 10:48 CLEAN 
0001 15.11.2017 10:27 CLEANING 
0001 15.11.2017 09:03 DIRTY 

日付フィールドのタイプはDATE、UnitおよびStatusの値は親テーブルのものです。

カラムのステータスに基づいて、ステータスDIRTYと次のステータスCLEANの差異を毎日および各ユニットごとに計算する必要があります。データの例が生成されます。

0001 17.11.2017 00:05 
0001 16.11.2017 02:32 
0001 15.11.2017 01:45 

問合せは、Oracle APEXのチャートのソースです。

答えて

0

が参加 - あなたがLEAD分析関数を使用することができます(「クリーン」で `どこのステータスを追加することにより、

SELECT unit, 
     "Date", 
     NUMTODSINTERVAL(Clean_date - "Date" =, 'DAY') AS difference 
FROM (
    SELECT t.*, 
     LEAD(CASE status WHEN 'CLEAN' THEN "Date" END) 
      IGNORE NULLS 
      OVER (PARTITION BY unit --, TRUNC("Date") 
        ORDER BY "Date" ASC) AS Clean_date 
    FROM your_table t 
) 
WHERE status = 'DIRTY'; 
+1

FWIW、これは作ることができるもう少しパフォーマンスを、 'DIRTY') 'をサブクエリに追加します。これは、OPが他のステータスを気にしないように見えるためです。 – Boneist

0

これを試してください。あなたは自分を必要としない

SELECT a.unit, 
     TRUNC (a.Date_t), 
      TO_CHAR (
       EXTRACT (HOUR FROM NUMTODSINTERVAL (a.Date_t - b.Date_t, 'DAY')), 
       'FM00') 
     || ':' 
     || TO_CHAR (
       EXTRACT (
        MINUTE FROM NUMTODSINTERVAL (a.Date_t - b.Date_t, 'DAY')), 
       'FM00') 
      diff 
    FROM (SELECT * 
      FROM yourtable 
      WHERE status = 'CLEAN') a 
     JOIN (SELECT * 
       FROM yourtable 
       WHERE status = 'DIRTY') b 
      ON a.unit = b.unit AND TRUNC (a.Date_t) = TRUNC (b.Date_t) 
ORDER BY 2 DESC; 
関連する問題