在子查询之间的ORACLE join语句中选择最高记录

时间:2012-12-18 02:29:55

标签: sql oracle

我想请求您帮助构建单个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 

这是为了确定哪个Pickup操作导致每个Move操作 “原因”列必须包括拾取作业记录的对象,其中移动操作旁边的时间最短。

我有一些想法如下,但不知道如何。
- 。它需要在Move的子查询和Pickup的子查询之间使用join语句 - 。必须通过要加入的移动记录对分拣子查询进行分区 - 。必须仅从分拣子查询的每个分区中选择最高记录

3 个答案:

答案 0 :(得分: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

我把列时间作为数字,这没有任何重要性,因为它是可排序的。

我将表格拆分为两个,Moves和Pickups,并且按时进行连接,pickup的时间大于move的时间。 (这种类型的连接在性能上并不是很好)。然后我choose拾取最小timefirst子句,order by p.time}。

答案 1 :(得分: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';

Here is a sqlfiddle

答案 2 :(得分:4)

有一个来自老派

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