-- 1.表结构
-- create table visit_hist( -- customer_id int comment '客户id' -- ,visit_date int comment '访问日期' -- ) -- 2.造测试数据 -- insert into visit_hist(customer_id,visit_date) values -- (11,11),(11,7),(22,5),(66,8),(55,4),(11,35),(22,32),(33,31),(55,39) -- with t1 as ( -- select customer_id -- ,visit_date -- from visit_hist vh -- where visit_date <30 -- ) -- 每个客户观察日(第30日)之前的最大拜访日期 with t2 as ( select customer_id ,max(visit_date) as max_visit_date from visit_hist vh where visit_date <30 group by customer_id )
-- select * from t2
-- 每个客户在观察日之前的最晚一个拜访日期之后30天内的拜访次数 ,t3 as (select t2.customer_id ,t2.max_visit_date ,sum(case when t_all.visit_date<t2.max_visit_date+30 then 1 else 0 end) as total_cnt_after from t2 left join visit_hist t_all on t2.customer_id=t_all.customer_id where t_all.visit_date >=30 and t_all.visit_date <90 group by t2.customer_id ) -- 这一句会产生total_cnt_after等于0的行,主要是由case when判断产生 -- select * from t3;
-- 下面的left join由于主表是t2其中的customer_id比t3多,因此会导致t2的某些行total_cnt_after为null值 -- -- 对观察日之前有过拜访记录的客户打上标签 -- select t2.customer_id -- ,t3.total_cnt_after -- ,case when t3.total_cnt_after>0 then 1 else 0 end as is_active -- from t2 -- left join t3 on t2.customer_id=t3.customer_id;
-- 打印MySQL版本 -- select version();