selecta.用户id,a.登陆时间,b.登陆时间from用户行为信息表asaleftjoin用户行为信息表asbon a.用户id = b.用户idwherea.应用名称='相机';
联结后的临时表记为表c,那么如何从表c中查找出时间间隔(明天登陆时间-今天登陆时间)=1的数据呢?
(1)这涉及到计算两个日期之间的差值,《猴子 从零学会sql》里讲到对应单函数是timestampdiff。下图是这个函数的用法。
select*,timestampdiff(day,a.登陆时间,b.登陆时间)as时间间隔fromc;
用case语句选出时间间隔=1的数据,并计数就是次日留存用户数
count(distinct casewhen时间间隔=1then用户idelsenull end) as 次日留存数
代入上面的sql就是:
select *,count(distinct when 时间间隔=1 then 用户idelsenull end) as 次日留存数from(select*,timestampdiff(day,a.登陆时间,b.登陆时间)as时间间隔fromc)group by a.登陆时间;
将临时表c的sql代入上面就得到了查询结果如下:
3.次日留存率
留存率=新增用户中登录用户数/新增用户数,所以次日留存率=次日留存用户数/当日用户活跃数
当日活跃用户数是count(distinct 用户id)
在上面分析次日留存数中,用次日留存用户数/当日用户活跃数就是次日留存率
select *,count(distinct when 时间间隔=1 then 用户id else null end) as 次日留存数 / count(distinct 用户id) as 次日留存率 from(select *,timestampdiff(day,a.登陆时间,b.登陆时间) as 时间间隔from c) as dgroup by a.登陆时间;