背景
购物网站新上线了两个活动,A活动是买手机壳的,B活动是买手机的,按理来说,买了手机的都会买手机壳,或者买了手机壳的都会买手机,我们目的是找出每个小时只参与了A或者B活动,而没有参与另一个活动的用户
不同活动每个小时购买用户的差值
1.每个活动按照小时进行分组,得到每个活动每个小时下的用户,每个用户一行
2.对于第一步得到的两个活动的临时表进行全连接,并获取字段为null的行,这些就是差异行
3.按照每个小时进行分组,把差异的行组合成一个字段,即可得到结果
select hm, slice(collect_set(diff_user_id1),1,100), slice(collect_set(diff_user_id2),1,100) from --每个小时参与A,B活动的用户的差异,截断100展示
(select coalesce(t1.hm,t2.hm) as hm,t1.user_id as diff_user_id1,t2.user_id as diff_user_id2 from
(select hm,user_id from XX where dt='${YYMMDD}' and act_id='A') as t1 --获取每个小时参与A活动的用户
full join
(select hm,user_id from XX where dt='${YYMMDD}' and act_id='B') as t2 --获取每个小时参与B活动的用户
on t1.hm = t2.hm and t1.user_id = t2.user_id and (t1.user_id is null or t2.user_id is null)
) as t3 group by hm
使用的数坊hive集合函数:
1.collect_set ,group by后把数据组成一个集合
2.slice, 对集合进行截取操作,比如截取一个集合的前100个元素