目录
一、原题地址
点我传送力扣原题地址https://leetcode.cn/problems/game-play-analysis-iv/description/
---------------------------------------------以上为原题---------------------------------------------
二、官方题解
select ifnull( round( count(distinct (Result.player_id)) / count(distinct (Activity.player_id)), 2 ), 0 ) as fraction from ( select Activity.player_id as player_id from ( select player_id, date_add(min(event_date), interval 1 day) as second_date from Activity group by player_id ) as Expected, Activity #存放所有人第二天登录的时间 where Expected.player_id = Activity.player_id and Activity.event_date = Expected.second_date ) as Result, Activity #存放所有第二天登录的人的表
三、核心思路
- 将所有人按照学号分组,找到所有人第二次登录的日期,存在表Expected中
- 找到所有第二次登录的人存在表Result中
- 计算比例
用到的函数扩展
ROUND(待处理的数字,需要保留的小数位数)
-->返回保留小数的数字
IFNULL(要查询的字段,如果为空就设置为此数字)本质是将所有满足的属性的所有NULL改为对应数字(0)
DISTINCT()去除重复的函数
点评:个人认为这种方法不太好写,我们来看看评论区大神们的Codes~~
四、民间方法
代码分享
短小精悍,牛的亚批!
SELECT ROUND(COUNT(DISTINCT player_id) / (SELECT COUNT(DISTINCT player_id) FROM Activity), 2) AS fraction
FROM Activity
WHERE (player_id, event_date) IN (
SELECT player_id, MIN(event_date) + INTERVAL 1 DAY
FROM Activity
GROUP BY player_id
);
思路分析
- 第一步还是和上面的思路一样,分组找出了第二次登录的日期
- 第三行是这个写法的神奇之处,可以看到where后面空格中的属性和第二次登录日期查出来的表对应的属性是一样且相对应的!
- 然后就是去重计算保留小数,与上面的方法一致