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

目录

 

一、原题地址

二、官方题解

三、核心思路

四、民间方法

        代码分享

        思路分析


 

一、原题地址

点我传送力扣原题地址https://leetcode.cn/problems/game-play-analysis-iv/description/【MySQL】分享一道比较有意思的MySQL力扣题_第1张图片

【MySQL】分享一道比较有意思的MySQL力扣题_第2张图片

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

二、官方题解

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~~


四、民间方法

        代码分享

【MySQL】分享一道比较有意思的MySQL力扣题_第3张图片

短小精悍,牛的亚批!

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. 然后就是去重计算保留小数,与上面的方法一致

 

 

你可能感兴趣的:(leetcode,算法,mysql)