因为实在找不到可以模拟该方法的案例,就简单的说一下大概的数据和处理逻辑,小伙伴们懂这个逻辑就行,到实战里活学活用:
select * from
(
/*这里的每一条假设是一个数据源,里面有大量的数据,可能存在单列重复数据*/
select 1001 id,'小白'name,60 achievement from dual
union all
/*这里的每一条假设是一个数据源,里面有大量的数据,可能存在单列重复数据*/
select 1001 id,'小白'name,100 achievement from dual
union all
/*这里的每一条假设是一个数据源,里面有大量的数据,可能存在单列重复数据*/
select 1001 id,'小白'name,30 achievement from dual)order by id
假设,这3条数据每一条都是做了某些限制得到的,我们将这些数据全部汇集到一起后,就会出现单列重复
而其他数据不重复的数据.我们要如何去除这些数据呢?
每一个数据源的限制都有一个限制的顺序,类似case when xx then xx when xxx then xxx end
所以我们用辅助列来假定他们的优先级.
select * from
(
/*这里的每一条假设是一个数据源,里面有大量的数据,可能存在单列重复数据*/
select 1001 id,'小白'name,60 achievement,1 sort from dual
union all
/*这里的每一条假设是一个数据源,里面有大量的数据,可能存在单列重复数据*/
select 1001 id,'小白'name,100 achievement,2 sort from dual
union all
/*这里的每一条假设是一个数据源,里面有大量的数据,可能存在单列重复数据*/
select 1001 id,'小白'name,30 achievement,3 sort from dual)order by id
我们用row_number
函数,并以id
分割,id,sort
排序,得出重复限制的优先级
select t.*,row_number()over(partition by id order by id,sort)a from
(
/*这里的每一条假设是一个数据源,里面有大量的数据,可能存在单列重复数据*/
select 1001 id,'小白'name,60 achievement,1 sort from dual
union all
/*这里的每一条假设是一个数据源,里面有大量的数据,可能存在单列重复数据*/
select 1001 id,'小白'name,100 achievement,2 sort from dual
union all
/*这里的每一条假设是一个数据源,里面有大量的数据,可能存在单列重复数据*/
select 1001 id,'小白'name,30 achievement,3 sort from dual)t order by id
我们只要a=1
的数据,剩下的都是单列重复的数据,这样,就完成了去除某行,单列重复的数据
的功能
select * from(select t.*,row_number()over(partition by id order by id,sort)a from
(
/*这里的每一条假设是一个数据源,里面有大量的数据,可能存在单列重复数据*/
select 1001 id,'小白'name,60 achievement,1 sort from dual
union all
/*这里的每一条假设是一个数据源,里面有大量的数据,可能存在单列重复数据*/
select 1001 id,'小白'name,100 achievement,2 sort from dual
union all
/*这里的每一条假设是一个数据源,里面有大量的数据,可能存在单列重复数据*/
select 1001 id,'小白'name,30 achievement,3 sort from dual)t order by id)
where a=1 order by id
//如果同一个 userid 和 post 则用修改日期判断,散掉多余的,或者修改日期比较早的数据
DELETE FROM xx/*自己的表*/ WHERE rowid in (select rowid from (select rowid,post,userid,to_char(UPDATATIME,'yyyy/mm/dd HH24:mi:ss')UPDATATIME,
row_number()over(partition by userid,post order by userid,post,UPDATATIME desc)a
from xx/*自己的表*/)where a<>1)