ORACLE 处理重复数据

【背景】 项目中的数据表出现了重复的记录,需要处理,考虑时间问题,决定先把重复数据提取出来,在数据表中删除所有重复数据,后面处理了重复数据再重新入库

【删除重复记录】

这里算是新学习的一个东西,一直以为delete from 没办法 删除与其他表做匹配的数据,原来通过in 可以进行多字段匹配 ,然后执行删除操作

--创建重复记录表1 (用作删除原表数据使用)
create table cf_order_1 as
select  to_char(t.log_time,'yyyy/mm') ctime,t.user_id,t.product_name,count(*) pv  from test_order_info_20220510 t
where
t.log_time >= to_date('2019/01/01 00:00:00','yyyy/mm/dd hh24:mi:ss')
and
t.log_time <= to_date('2023/01/01 00:00:00','yyyy/mm/dd hh24:mi:ss')
group by to_char(t.log_time,'yyyy/mm'),t.user_id,t.product_name
having count(*) > 1
order by count(*) desc


--创建重复记录详细表2 (用作去重数据使用)
create table cf_order_2 as
select t.*  from tbl_order t,cf_order_1 a
where
t.user_id = a.user_id 
and
t.product_name = a.product_name
and
to_char(t.log_time,'yyyy/mm') = a.ctime


--通过相关字段删除 原表中的所有重复记录

delete from tbl_orderxxx t where  
(t.user_id,t.product_name,to_char(t.log_time,'yyyy/mm')) in(select  a.user_id,a.product_name, a.ctime from  cf_order_1 a)
 
--由于处理重复数据需要用到rownum  所有这里在表2的基础上  创建表3 

create table  cf_order_3 as
select rownum rn,t.* from  cf_order_2 t


--重复表去重处理()
select * from cf_order_3 t where t.rn in 
(select t.rown from 
(select  t.user_id,t.product_name,to_char(t.valid_time,'yyyy/mm'),max(t.rn) rown from cf_order_3 t
group by t.user_id,t.product_name,to_char(t.valid_time,'yyyy/mm')
order by t.user_id) t

-- 获取表所有字段
 select column_name
from user_tab_cols
where table_name = upper('cf_order_3')
and column_name not in ('RN');

--将去重后的数据 去掉rownum插入到原始表即可

insert into tbl_orderxxx 
select ACTION_TYPE,USER_ID,LOG_TIME,MEDIACODE,PRODUCT_PRICE,PRODUCT_CODE,PRODUCT_TYPE,PRODUCT_NAME,PAY_TYPE,VALID_TIME,EXPIRED_TIME,PURCHASE_TIME,SERVICE,SYS_ID,PROVIDER_ID,SHARE_CP_ID,SHARE_CP_PRICE,CP_ID,REFERURL,SYS_LOG_TIME
 from cf_order_3 t where t.rn in 
(select t.rown from 
(select  t.user_id,t.product_name,to_char(t.valid_time,'yyyy/mm'),max(t.rn) rown from cf_order_3 t
group by t.user_id,t.product_name,to_char(t.valid_time,'yyyy/mm')
order by t.user_id) t
)  

--回收站清理
select * from user_recyclebin;
purge recyclebin;











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值