550. Game Play Analysis IV

博客围绕力扣(LeetCode)的题目展开,介绍了两种解题思路。思路一是创建子表消除重复、找出初次登录日期等进行联合查询;思路二则是增加列记录,查询特定记录与总数比值。思路二存在变量赋值出错的问题,还给出了两种思路的提交用时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、题目描述

在这里插入图片描述
来源:力扣(LeetCode)

2、解题思路

思路一

1# 创建子表a1,消除重复distinct player_id,event_date
2# 创建子表a2,找出每个玩家初次登录日期select player_id,min(event_date) as event_date from Activity group by player_id
3# a1,a2 联合查询,找出日期相差为1的记录,数量select count(a1.player_id) as c,条件datediff(a1.event_date,a2.event_date)=1
4# 联合Activity查询,进行数量比z.c / count(distinct a.player_id)

思路二

1# 增加2列记录,1、每个玩家event_date的排序rank,每个日期跟上个日期之差diff,语句如下:
@k:=case when @j=(@j:=player_id) then @k+1 else 1 end as rank
datediff(event_date,@i)*(@i<>(@i:=event_date)) as diff
2# 查询,diff=1,rank=2 的记录与总数比值即可

思路二的坑

原来的思路是一句语句嵌套查询,不需要建立子表。但是,将@i:=event_date@j:=player_id同时放在select下,@j赋值会出错,例如第二个用例
在这里插入图片描述
出现以下情况,变量@i则赋值符合预期,@j则不然,(i_befor,i_after表示赋值前和赋值后的值):
在这里插入图片描述
使用更多的数据测试后发现,j_after会一直重复3
暂时不理解变量传递过程,期待以后填坑…

3、提交记录

思路一

select round(z.c / count(distinct a.player_id),2) as fraction
from Activity a , 
(select count(a1.player_id) as c 
from 
(select distinct player_id,event_date from Activity) a1,
(select player_id,min(event_date) as event_date from Activity group by player_id ) a2
where a1.player_id=a2.player_id and datediff(a1.event_date,a2.event_date)=1) z

522ms
在这里插入图片描述

思路二

select round((sum(case when diff=1 and rank=2 then 1 else 0 end) / count(distinct player_id)),2) as fraction 
from(select a.*,datediff(event_date,@i)*(@i<>(@i:=event_date)) as diff,@k:=case when @j=(@j:=player_id) then @k+1 else 1 end as rank
from Activity a ,(select @i:=-1,@j:=-1,@k:=1) b
order by player_id, event_date) z

550ms
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值