解题思路:
1.查询每个用户首次登陆时间和最后活跃时间表t1;
2.查询当前时间和总用户数表t2,假设今天就是数据中所有日期的最大值;
3.查询每个用户首次登陆距离今天、最后活跃距离今天的时间差表t3;
4.用户分级group by user_grade,计算分级用户占比;
函数说明:
1)使用left join左连接,on 1表示两个表之间的连接条件恒成立,即以笛卡尔积的形式(左表的行数*右表的行数)相连接;
2)timestampdiff()函数的作用是返回两个日期时间之间的整数差。而datediff()函数的作用也是返回两个日期值之差。
它们的函数语法分别为:
TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)
DATEDIFF(expr1,expr2)
3)计算人数占比时使用max(total),总人数从子表得到,非聚合列避免语法错误加了max。
select user_grade, #计算占比,总人数从子表得到,非聚合列避免语法错误加了MAX:COUNT(uid) / MAX(user_cnt) as ratio round(count(uid)/max(total),2) ratio from (select uid,total, case when first_diff<7 then '新晋用户' when last_diff>=30 then '流失用户' when last_diff>=7 then '沉睡用户' else '忠实用户' end user_grade from (select uid,total, timestampdiff(day,first_date,now_date) first_diff, timestampdiff(day,last_date,now_date) last_diff from (select uid,min(in_time) first_date,max(out_time) last_date from tb_user_log group by uid) t1 left join (select max(out_time) now_date, count(distinct uid) total from tb_user_log)t2 on 1)t3)t4#on 1表示两个表之间的连接条件恒成立,即以笛卡尔积的形式(左表的行数*右表的行数)相连接 group by user_grade order by ratio desc ;

京公网安备 11010502036488号