拿到一个需求:需要找出50个客户使得用户画像标签尽可能丰富(有值的)
tips:用户画像标签有500多个分散在30多个表中,即一个用户有500多个标签属性
解决办法:
例如有三张表a1,a2,a3,每张表的字段不同(但是客户数是一样的id)
select
*
from
test.test1
left join test.test2 on
test1.id = test2.id2
left join test.test3 on
test3.id3 = test1.id;
结果如下:
找出这三张表中标签字段最丰富的客户
思路:
a.先将要比较的字段拼接成一行
b.再行转列(此时所有的字段都存放到一列中了,相当于求该列有值的情况下,哪个客户的记录数最多的问题了)
select c.* from (
select b.id,count(id) col_num from (
select * from (
select test1.id,
concat_ws('_',test1.*,test2.*,test3.*
) conent
from homestead_test.test1
left join homestead_test.test2 on test1.id = test2.id2
left join homestead_test.test3 on test1.id= test3.id3
) a lateral view explode(split(conent,'_')) v_num as num
) b where b.num !='' and b.num!='0' and b.num!='0.0' group by b.id
) c order by c.col_num desc
结果如下:得到每个id 对应的有值的字段