【背景】 项目中的数据表出现了重复的记录,需要处理,考虑时间问题,决定先把重复数据提取出来,在数据表中删除所有重复数据,后面处理了重复数据再重新入库
【删除重复记录】
这里算是新学习的一个东西,一直以为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;
|