Mysql全部题目练习264题

#我想的是把每个日期的新用户表 和每个日期新用户第二天依然登录表都输出出来
#也很简单 每个日期新用户表 用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

 

 

 

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值