#我想的是把每个日期的新用户表 和每个日期新用户第二天依然登录表都输出出来
#也很简单 每个日期新用户表 用min函数实现 左连接一手原表 保留所有日期嘛 有的新用户表可能少日期 没法输出那个日期
#第二天表就是用min+1实现 然后内连接原表看看到底存不存在 最后不能左连接一手原表 否则他不在新用户表那一行 后面group by 的时候呢
#就会找不到 所以要让新用户表和第二天表做左连接 连接键为用户就行
#最后一个难点 发现新用户表即分母位置为零 返回None而不是0 分子是不是0无所谓
#想到用case when 函数解决 分母为0 返回0.000 分母不为零 返回值
select
l.date
,case
when count(a.user_id) !=0
then round(count(d.u1)/count(a.user_id),3)
else 0.000
end
from login l
left join
(
select
user_id
,min(date) date
from login
group by 1
) a
on l.user_id = a.user_id and l.date = a.date
left join
(
select
c.user_id u1
,c.date c1
from
(
select
user_id
,min(date)+1 date
from login
group by 1
) c
join login e
on c.user_id = e.user_id and c.date = e.date
) d
on a.user_id = d.u1
group by 1
order by 1
#下面这个用的是全表 每个日期新用户表 dateiff来实现
#连接新表的同时 user_id相等 且 date(原表,每个日期的新用户表的日期)= 1 来实现找到每个日期新用户表的第二天
select
l.date
,ifnull(round(count(d.user_id)/count(a.user_id),3),0.000)
from login l
left join
(
select
user_id
,min(date) date
from login
group by 1
) a
on l.user_id = a.user_id and l.date = a.date
left join login d
on a.user_id = d.user_id
and datediff(d.date,a.date) = 1
group by 1
order by 1