6

単一の ORACLE SQL ステートメントを作成するために、あなたの助けを求めたいと思います:

以下のようにジョブテーブルを使用する

Object | Operation | Time  
A      | Move      | 12:01  
B      | Move      | 12:02  
C      | Pickup    | 12:03  
D      | Move      | 12:04  
B      | Pickup    | 12:05  

以下のように結果テーブルを取得します。

Object | Operation | Time  | Cause  
A      | Move      | 12:01 | C  
B      | Move      | 12:02 | C  
D      | Move      | 12:04 | B 

これは、各 Move 操作の原因となった Pickup 操作を特定するためです。
「原因」列には、移動操作のすぐ隣にある時間の最も短いピックアップ ジョブ レコードのオブジェクトを含める必要があります。

以下のようにいくつかのアイデアがありますが、方法がわかりません。
-。Move 用のサブクエリと Pickup 用のサブクエリの間には、join ステートメントが必要
です。Pickup のサブクエリは、結合するムーブ レコードで分割する必要があります
-。Pickup サブクエリの各パーティションからのみトップ レコードを選択する必要があります

4

3 に答える 3

4

これは私の試みです:

select  m.object, m.operation, m.time, 
  max(p.object) keep (dense_rank first order by p.time) cause,
  max(p.time) keep (dense_rank first order by p.time) cause_time
from a m
join a p on (p.time > m.time)
where m.operation = 'Move'
and p.operation = 'Pickup'
group by m.object, m.operation, m.time;

SQLFiddleを参照してください

列の時間を数値として入力しましたが、これはソート可能であるため重要ではありません。

私はテーブルを移動とピックアップの 2 つに分割しました。結合は時間通りに行われ、時間は の時間pickupよりも大きくなっていmoveます。(このタイプの結合はパフォーマンスに優れていません)。次にchoose、最小のtime(first句、order by p.time) を使用してピックアップします。

于 2012-12-18T06:38:53.513 に答える
4

これは私の試みです:

select object, operation, time, t.pobject
from a join 
   (select object pobject, time cur, lag(time,1, 0) over (order by time  ) prev 
      from a
     where operation = 'Pickup')t 
on a.time > t.prev and a.time <= t.cur
where operation = 'Move';

ここにsqlfiddleがあります

于 2012-12-18T07:16:24.757 に答える
4

古い学校からの 1 つがあります。

select j1.Object, j1.Operation, j1.Time, substr(min(j2.Time || j2.Object), 6) Cause
from job j1, job j2
where j1.Operation like 'Move'
  and j1.Time < j2.Time
  and j2.Operation like 'Pickup'
group by j1.Object, j1.Operation, j1.Time

ここにSQLFiddleがあります

于 2012-12-18T08:54:58.093 に答える