oracle特殊数据需求 etl

0
---更新1;重复的潜客默认其他信息一致,可以任意舍弃其一
 大家好,有个问题想请大家帮忙:潜在客户是主键,但是潜客在业务录入的时候有可能是用一个,比如同一个家庭2条咨询录入的潜客,业务上认为计数时算同一个潜客。具体规则是 手机1 手机2 手机3 中任意两个相同 ,或微信相同 或qq相同 都算同一个潜客。如id=aa手机1是999,id=bb的手机3是999,那么aa、bb是同一个潜客; cc的微信和dd微信相同 ,那么他们也是同一个潜客。 
姓名不用考虑,表中有其他属性如来访类型,所以不能只计总数,要带有主键信息,如我可能需要去重规则之后来访类型是上门的潜客数。
最后能计数且保留主键信息,即我要能算出 不重复的客户数,有要保留数据本身的属性比如来访类型信息要保留。
环境是oracle,sql 、存储过程、 kettle工具等不限,欢迎任何思路,谢谢

 
QQ图片20161221101455.png 11111115002.png
已邀请:
3

老头子 - 专注是唯一的捷径 2016-12-21 回答

更新:
附件为表和数据的dmp文件,下载解压后使用imp命令导入scoot用户即可。
发现涉及到一个迭代循环的对比过程见下图:
qq2.png
 
所以运算量远比我下面说的要大,换种思路,先把qq和WeChat的去重,然后将三个手机号作为表关联,取出相同的部分,SQL如下(这个SQL只能进行一次性对比,所以结果还是有重复的,迭代可以在sp里写个循环,迭代到没有重复数据,速度比逐条对比要快很多):
with a as ---filte all the same recordes
(select max(id) id, t.phone1,t.phone2,t.phone3,t.qq,t.wechat from LAOTOUZIDASHUAIGE t
where t.phone1||t.phone2||t.phone3||t.qq||t.wechat is not null
group by t.phone1,t.phone2,t.phone3,t.qq,t.wechat)
, qq as ---reomove duplicate qq recordes
(select distinct max(t1.id) over(partition by t1.qq) as id from a t1
union all
select id as id from a t1 where t1.qq is null)
, wechat as ---reomove duplicate wechat recordes
(
select distinct max(t1.id) over(partition by t1.wechat) as id from a t1
union all
select id as id from a t1 where t1.wechat is null)
, phone1 as ---reomove duplicate qq&wechat recordes
(select id,phone1 from a where id in (
select id from qq
intersect
select id from wechat))
, phone2 as 
(select id,phone2 from a where id in (
select id from qq
intersect
select id from wechat))
, phone3 as 
(select id,phone3 from a where id in (
select id from qq
intersect
select id from wechat))
---hehehe
select * from a where id in(
select distinct greatest(p1.id,p2.id,p3.id) id from phone1 p1,phone2 p2,phone3 p3
where (p1.phone1 = p2.phone2
   or p1.phone1 = p3.phone3
   or p2.phone2 = p3.phone3)
)
order by id

 
===================
分割线,下面的是第一次回答
===================
按照你的思路去对比,运算量太大,且不管QQ和微信,就三个手机号的对比就是指数爆炸的增长
假如有1000条数据待对比,就是3^1000 = 1.322e477次对比运算。
可以换个思路转换需求
。。。。
 
 
 
不过我没想出来
qq.jpg

坐等大神解答

spark去解决这类问题应该很快
0

GeorgeYao - 路漫漫其修远兮,吾将上下而求索! 2016-12-21 回答

需求是又要确保历史数据的存储(历史数据又不重复),又要确保运算工具使用的便捷。这个问题还坐等大神回答吧......

01.jpg

 
0

BAO胖子 - 15年BI经验,涉足电力,快消品,医药,信息服务等行业的BI老兵。 2016-12-21 回答

一点不成熟的想法,抛砖引玉。

对于微信和QQ,这俩容易解决,就不多讲了。
手机号,可以建一张中间表,进行行列转换,这样一条记录转成三条,再按手机号求非NULL count数据,应该就差不多了。我当下不太方便实验,你可以先试试。
0

li052468 2016-12-22 回答

可不可以这样,首先根据三个手机号的先各自去重,生成三张表(如a,b,c三张),然后a和b关联去重得到d,在用d和c关联去重;这样同一个手机号就不会有多条数据了,但可能同一潜在客户ID有多条数据(添了多个不同手机号),再根据潜在客户ID去重一次就可以了

要回复问题请先登录注册