题目描述: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
京公网安备 11010502036488号