LeetCode(数据库)- 游戏玩法分析 IV

题目链接:点击打开链接

 

题目大意:略。

 

解题思路:

  • 解决方案(1):先用 WITH AS 语句算出经过排序后以及打一个每组第一次登录的标记(mark);然后下面的查询不用过多解释了吧(分子不需要 DISTINCT 因为可以保证每组只有一个)
  • 解决方案(2):略,太好理解了

 

AC 代码

-- 解决方案(1)
WITH t1 AS(
    WITH t2 AS(SELECT * FROM Activity ORDER BY player_id, event_date)
    SELECT *, IF(@p<>player_id, 1, 0) mark, @p:=player_id
    FROM t2, (SELECT @p:=-1) init
)

SELECT ROUND((SELECT COUNT(tt2.player_id)
FROM t1 tt1, t1 tt2
WHERE tt1.player_id = tt2.player_id AND DATEDIFF(tt1.event_date, tt2.event_date) = 1 AND tt2.mark = 1)
/
(SELECT COUNT(DISTINCT player_id) FROM Activity), 2)
AS fraction

-- 解决方案(2)
SELECT ROUND(avg(a.event_date IS NOT NULL), 2) fraction
FROM 
    (SELECT player_id, min(event_date) AS login
    FROM activity
    GROUP BY player_id) p 
LEFT JOIN activity a 
ON p.player_id = a.player_id AND datediff(a.event_date, p.login) = 1
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆氪和他的那些代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值