【MySQL】分享一道比较有意思的MySQL力扣题
目录
一、原题地址
点我传送力扣原题地址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后面空格中的属性和第二次登录日期查出来的表对应的属性是一样且相对应的!
- 然后就是去重计算保留小数,与上面的方法一致
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」