解题思路:

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
;