0

次のような Oracle 11g データベースのテーブルがあります。

process_times:
--------------------------------------------
machine_id | load_id | start_time | end_time

レコードの例は次のようになります。

process_times:
----------------------------------------------------------------
machine_id | load_id | start_time          | end_time
----------------------------------------------------------------
220        | 25      | 06/24/2012 04:29:00 | 06/25/2012 04:42:38
187        | 23      | 06/22/2012 14:41:00 | 06/24/2012 00:34:32
187        | 18      | 06/20/2012 11:57:00 | 06/20/2012 23:53:51

各マシンのロード間のダウンタイムを表す属性との関係を返すクエリを作成しようとしています。ダウンタイムとは、特定のマシンの各 end_time と次の start_time の間の時間を意味します。

したがって、上記の例では、次のような結果が得られます。

result:
----------------------
machine_id | down_time
----------------------
220        |  0
187        |  (06/22/2012 14:41:00 - 06/20/2012 23:53:51) -- the actual result, I wrote it like this to be more clear

私は午後のかなりの部分でこれをいじっていましたが、それは私が実際に書き込もうとしているクエリの前提条件にすぎないので、誰かが私を正しい方向に導くための指針を持っているかどうかを確認するために投稿すると考えました方向。

編集言及すべきもう 1 つの制約は、特定の期間のダウン時間の合計だけでなく、各マシンの個々のダウン時間を結果リストに含める必要があることです。

4

2 に答える 2

2

興味深い質問です。前/次のレコードを取得してから減算を実行することから始める必要があります。幸い、Oracleにはこのためのリード/ラグ機能があります。

それで:

select machine_id, (lastend - start_time) as down_time
from (select pt.*,
             lag(end_time, 1) over (partition by machine_id order by end_time) as lastend
      from process_time pt
     ) pt
where lastend is not null

これにより、終了時刻のある前のレコードが検索され、ダウンタイムが計算されます。

于 2012-06-25T19:47:42.167 に答える
1

これはテストされていませんが、私のコメントに続いて、これはあなたに稼働時間を与えるでしょう。合計時間枠がわかっている場合、ダウンタイムはアップタ​​イムから簡単に導き出されます。

SELECT machine_id, SUM(joblen) AS uptime
FROM (
    SELECT machine_id, (end_time - start_time) AS joblen
    FROM process_times
    )
GROUP BY machine_id

実際、サブクエリは必要ないかもしれません、あなたは次のようなことをすることができるかもしれません

SELECT machine_id, SUM(end_time - start_time) AS uptime
FROM process_times
GROUP BY machine_id

でもわかりません。

そこから、次のようなことを行うことができます。

SELECT machine_id, (lifetime - uptime) AS downtime
FROM (
    SELECT machine_id, 
        SUM(end_time - start_time) AS uptime, 
        (min(start_time) - max(end_time) as lifetime
    FROM process_times
    GROUP BY machine_id
    )

とにかく、これは私がそれにアプローチする方法の大まかな概要です、それはほぼ間違いなくカットアンドペーストタイプの答えではありません。

于 2012-06-25T19:54:01.950 に答える