题目描述:sql语句查询每个日期新用户的次日留存率,结果保留小数点后面3位数(3位之后的四舍五入),并且查询结果按照日期升序排序。
思路:基本上就是把前面几道题综合起来,当然愣是没想起来用union的我没底气说这话。o(╥﹏╥)o
步骤一:首先找到新用户的首次登录日
select user_id, min(date) as m_date from login group by user_id
步骤二:连接login找出新用户的次日留存率
select n.m_date, round(count(distinct l.user_id)/count(n.user_id),3) as p from new n left join login l on l.user_id=n.user_id and l.date=adddate(n.m_date,interval 1 day) group by n.m_date
步骤三:按照步骤二的输出格式,找出没有新用户的日期
select date,0.000 as p from login where date not in (select min(date) from login group by user_id)
最后union组合存在新用户和不存在新用户的结果:
with new as ( select user_id, min(date) as m_date from login group by user_id ), keep as ( select n.m_date, round(count(distinct l.user_id)/count(n.user_id),3) as p from new n left join login l on l.user_id=n.user_id and l.date=adddate(n.m_date,interval 1 day) group by n.m_date ), no_new as ( select date,0.000 as p from login where date not in (select min(date) from login group by user_id) ) select * from keep union select * from no_new order by 1