我想请求您帮助构建单个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语句
- 。必须通过要加入的移动记录对分拣子查询进行分区
- 。必须仅从分拣子查询的每个分区中选择最高记录
答案 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
拾取最小time
(first
子句,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';
答案 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