#ROW_NUMBER()# #PARTITION#
现在log表中有重复电票号的数据,每条记录的修改时间不一样。我想用每个电票号最新修改的数据,怎么做?
传统方案:
select a.* from
(select electric_draft_id,max(id) max_last
from tbl_swt_business_log
group by electric_draft_id) b
inner join tbl_swt_business_log a
on ( a.id = b.max_last);
执行计划
走了一个全表索引。
使用row_number() 和partition后:
select *
from(
select a.*,ROW_NUMBER() OVER (PARTITION BY electric_draft_id ORDER BY id DESC) as rn
from tbl_swt_business_log a
) t
where rn=1;
执行计划:
当前数据量:
测试下来:似乎传统方式 即使走了两层全表查询,速度依然比ROW_NUMBER()要快?!
不知道是Oracle对表的优化,还是因为数据量太少,看不出效果。等哪天我重做百万的数据,再次测试一下。