我有一张桌子,上面有来自我们员工的实时扫描数据。如您所见,每个盒子可以被多次扫描,甚至员工也可以多次扫描一个状态的盒子。
我正在尝试提取每个框的最新记录,但是最新记录的状态应该为“已拒绝”
从图片中可以看到,尽管Carton 1234的记录状态为“拒绝”,但该记录不是最后一个,因此我不需要此记录。而纸箱1235是我所需要的。
我不想使用窗口函数首先对表中的每条记录进行排名,因为表中有很多行,并且我认为这很耗时。
那么还有什么更好的方法可以实现我的目标?
答案 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);