根据PL / SQL中的某些条件选择最新记录

时间:2018-07-24 20:48:38

标签: sql oracle plsql

我有一张桌子,上面有来自我们员工的实时扫描数据。如您所见,每个盒子可以被多次扫描,甚至员工也可以多次扫描一个状态的盒子。

我正在尝试提取每个框的最新记录,但是最新记录的状态应该为“已拒绝”

从图片中可以看到,尽管Carton 1234的记录状态为“拒绝”,但该记录不是最后一个,因此我不需要此记录。而纸箱1235是我所需要的。

我不想使用窗口函数首先对表中的每条记录进行排名,因为表中有很多行,并且我认为这很耗时。

那么还有什么更好的方法可以实现我的目标?

enter image description here

2 个答案:

答案 0 :(得分:2)

假设您实际上并不需要PL / SQL解决方案。这仅是SQL:

这是没有窗口功能的解决方案:

select *
from mytable
where (carton_id, scantime) in
(
  select carton_id, max(scantime)
  from mytable
  group by carton_id
  having max(status) keep (dense_rank last order by scantime) = 'Refused'
);

但是我不认为这优于使用窗口函数。所以您也可以尝试

select *
from
(
  select mytable.*, max(scantime) over (partition by carton_id) as max_scantime
  from mytable
  group by carton_id
)
where scantime = max_scantime and status = 'Refused';

答案 1 :(得分:1)

这是一种方法:

select t.*
from t
where t.status = 'Refused' and
      t.scantime = (select max(t2.scantime) from t t2 where t2.carton_id = t.carton_id);