[Oracle]去除某行,单列重复的数据

[Oracle]去除某行,单列重复的数据

  • 01.说明
  • 02.添加辅助列
  • 03.优先级排序
  • 04.去除重复项
  • 05.批量删除

01.说明

因为实在找不到可以模拟该方法的案例,就简单的说一下大概的数据和处理逻辑,小伙伴们懂这个逻辑就行,到实战里活学活用:

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条数据每一条都是做了某些限制得到的,我们将这些数据全部汇集到一起后,就会出现单列重复而其他数据不重复的数据.我们要如何去除这些数据呢?

02.添加辅助列

每一个数据源的限制都有一个限制的顺序,类似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

在这里插入图片描述

03.优先级排序

我们用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

在这里插入图片描述

04.去除重复项

我们只要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

在这里插入图片描述

05.批量删除

//如果同一个 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)

你可能感兴趣的:(Oracle汇总笔记,oracle,数据库,sql)