ORACLE解决数据重复问题,提取非重复数据和重复数据

ORACLE解决数据重复问题,提取非重复数据和重复数据

 

背景:项目需要提取数据表中的数据,数据有几种特殊情况,一种是基本的数据,第二种是重复数据,第三种是重复数据,但是重复的不明显的。

举例说明,用户在单个月份订购了一款产品,正常流程用户一个月内,只能有一次订购记录,但是由于数据采集端有重复采集的情况,造成了一条数据被多次写入,如下:

 

需求: 把重复的,有部分重复的,跟正常的分别都提出来,正常的单独放一个表文件,不正常的单独放一个文件

 

解决方案:最开始写sql的时候,只想着把几部分的数据分别提出来再组合,比如提取重复的用group by 提取出来,然后再此基础上再想办法解决部分重复的问题,部分重复需要通过写条件来筛选,比如同一个表 userid相同,订购产品相同,订购时间to_char(t.valid_time,'yyyy/mm') 月份相同,但是t.valid_time 又不相同的,可以想象提取出来非常麻烦,会漏掉其他特殊情况

 

最后想到一个解决办法,oracle一般解决重复数据问题都是通过rownum的方式,随即也用到这里,

第一步把需要使用的字段 加上rownum rn 提取处理出来,

第二步通过关键字段作为group by 主键,然后以to_char(t.valid_time,'yyyy/mm')作为重复数据依据,直接把重复数据行号rownum最大的行数找出来,这里就是区分 重复和非重复数据的关键所在,

第三步就是以行号为媒介,把最后的数据关联出来,问题解决。

create table testorderall2020cp as 
select * from testorderall2020 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 testorderall2020 t
group by t.user_id,t.product_name,to_char(t.valid_time,'yyyy/mm')
order by t.user_id) t
) 

 

数据导出:

我只能说sqluldr2 是真的香啊

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值