【MySQL】分享一道比较有意思的MySQL力扣题

目录

 

一、原题地址

二、官方题解

三、核心思路

四、民间方法

        代码分享

        思路分析


 

一、原题地址

点我传送力扣原题地址https://leetcode.cn/problems/game-play-analysis-iv/description/5a42569fe42243e38f0a36c69943d1cd.png

cb1abb4abb734a0c8629506d0ee83de2.png

---------------------------------------------以上为原题---------------------------------------------

二、官方题解

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 #存放所有第二天登录的人的表

 

三、核心思路

  1. 将所有人按照学号分组,找到所有人第二次登录的日期,存在表Expected中
  2. 找到所有第二次登录的人存在表Result中
  3. 计算比例

用到的函数扩展

ROUND(待处理的数字,需要保留的小数位数)

-->返回保留小数的数字


IFNULL(要查询的字段,如果为空就设置为此数字)

本质是将所有满足的属性的所有NULL改为对应数字(0)

DISTINCT()

去除重复的函数

 点评:个人认为这种方法不太好写,我们来看看评论区大神们的Codes~~


四、民间方法

        代码分享

5a9912912f4f49f0b488375769e0dc7a.png

短小精悍,牛的亚批!

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
);

        思路分析

  1. 第一步还是和上面的思路一样,分组找出了第二次登录的日期
  2. 第三行是这个写法的神奇之处,可以看到where后面空格中的属性和第二次登录日期查出来的表对应的属性是一样且相对应的!
  3. 然后就是去重计算保留小数,与上面的方法一致

 

 

posted @   IoOozZzz  阅读(14)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示