--第一步:去重t1,并保留最新状态得到所有用户的状态
--第二步:去重t2,并保留最新状态
create table t2_temp as
select
t1.updatetime, t1.userid, t2.statu, t2.pt_d
from
(
select
updatetime
,userid
from (
select
MAX(updatetime) over(partition by userid) as updatetime
,userid
from default.t2_stastus_new_user)tt1
group by updatetime
,userid)t1
left join
(
select
updatetime,userid,statu,pt_d
from default.t2_stastus_new_user
where pt_d<= '0407') t2
on t1.userid=t2.userid and t1.updatetime=t2.updatetime
---第三步 t2_temp left join t1
求用户数
select
pt_d
,bind_user_flag+bind_new_user_flag as bind_users
,unbind_user_flag
,bind_user_flag+bind_new_user_flag-unbind_user_flag as in_bind_users
from (
select
pt_d
,sum(`if`(bind_user_flag>0,1,0)) as bind_user_flag
,sum(`if`(bind_new_flag>0,1,0)) as bind_new_user_flag
,sum(`if`(unbind_flag>0,1,0)) as unbind_user_flag
from (
select
pt_d
,updatetime
,userid
,statu
,t3.statu_flag
,sum(`if`((statu = '1' and statu_flag = '0'),1,0)) as bind_user_flag
,sum(`if`((statu = '1' and statu_flag is null),1,0)) as bind_new_flag
,sum(`if`((statu = '0' and t3.statu_flag = '1'),1,0)) as unbind_flag
from
(select t2.updatetime,t2.userid,t2.statu,t1.statu as statu_flag,t2.pt_d
from
(select
updatetime,userid,statu,pt_d
from t2_temp) t2
left join
(
select updatetime,userid,statu
from t1_stastus_all_user
)t1
on t2.userid = t1.userid)t3
group by pt_d
,updatetime
,userid
,statu
,statu_flag
order by userid)t4
group by pt_d)t5