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

Sho*_*Sul 6 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  
Run Code Online (Sandbox Code Playgroud)

获取结果表如下.

Object | Operation | Time  | Cause  
A      | Move      | 12:01 | C  
B      | Move      | 12:02 | C  
D      | Move      | 12:04 | B 
Run Code Online (Sandbox Code Playgroud)

这是为了确定哪个Pickup操作导致每个Move操作.
"原因"列必须包括移动操作旁边最小时间的拾取作业记录的对象.

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

Flo*_*ita 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;
Run Code Online (Sandbox Code Playgroud)

参见SQLFiddle

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

我已将表分成两部分:“移动”和“取件”,并且连接是按时进行的,“时间”pickup大于“时间” move。(这种类型的连接对性能影响不大)。然后我用最小的(子句, with )choose拾取。timefirstorder by p.time