LeetCode--550. 游戏玩法分析 IV

文章目录

  • [1 题目描述](#1 题目描述)
  • [2 测试用例](#2 测试用例)
  • [3 解题思路](#3 解题思路)
    • [3.1 解法 1:](#3.1 解法 1:)

1 题目描述

Table: Activity

sql 复制代码
+--------------+---------+  
| Column Name  | Type    |  
+--------------+---------+  
| player_id    | int     |  
| device_id    | int     |  
| event_date   | date    |  
| games_played | int     |  
+--------------+---------+  

(player_id, event_date) 是此表的主键 (具有唯一值的列的组合).

这张表显示了某些游戏的玩家的活动情况.

每一行是一个玩家的记录, 他在某一天使用某个设备注销之前登录并玩了很多游戏 (可能是 0).

2 测试用例

编写解决方案, 报告在首次登录的第二天再次登录的玩家的比率 , 四舍五入到小数点后两位. 换句话说, 你需要计算从首次登录日期开始至少连续两天登录的玩家的数量, 然后除以玩家总数.

结果格式如下所示:

**示例 1: **

**输入: **

sql 复制代码
Activity table:  
+-----------+-----------+------------+--------------+  
| player_id | device_id | event_date | games_played |  
+-----------+-----------+------------+--------------+  
| 1         | 2         | 2016-03-01 | 5            |  
| 1         | 2         | 2016-03-02 | 6            |  
| 2         | 3         | 2017-06-25 | 1            |  
| 3         | 1         | 2016-03-02 | 0            |  
| 3         | 4         | 2018-07-03 | 5            |  
+-----------+-----------+------------+--------------+  

**输出: **

sql 复制代码
+-----------+  
| fraction  |  
+-----------+  
| 0.33      |  
+-----------+  

**解释: **

只有 ID 为 1 的玩家在第一天登录后才重新登录, 所以答案是 1/3 = 0.33

3 解题思路

  1. 先按照 player_id 分组统计每个玩家第一次登录的时间 min(event_date) as loginDate
  2. 左外链接 Activity 查找第一次登录后, 第二天有登录的玩家 left join Activity b on a.player_id = b.player_id and datediff(b.event_date, a.loginDate) = 1, 需要用到 datediff() 函数
  3. 计算首次登录后连续两天都登录的玩家占所有玩家的比例, 需要用到 avg() 函数

3.1 解法 1:

解题思路的步骤 1

sql 复制代码
select player_id, min(event_date) as loginDate from Activity group by player_id  

执行结果

player_id loginDate
1 2016-03-01
2 2017-06-25
3 2016-03-02

解题思路的步骤 2

sql 复制代码
select a.*, b.*  
from (select player_id, min(event_date) as loginDate from Activity group by player_id) as a  
         left join Activity b on a.player_id = b.player_id and datediff(b.event_date, a.loginDate) = 1;  

执行结果

player_id loginDate player_id device_id event_date games_played
1 2016-03-01 1 2 2016-03-02 6
2 2017-06-25 null null null null
3 2016-03-02 null null null null

解题思路的步骤 3

sql 复制代码
select round(avg(b.event_date is not null), 2) as fraction  
from (select player_id, min(event_date) as loginDate from Activity group by player_id) as a  
         left join Activity b on a.player_id = b.player_id and datediff(b.event_date, a.loginDate) = 1;  

执行结果

fraction
0.33
相关推荐
TracyCoder1233 小时前
LeetCode Hot100(19/100)——206. 反转链表
算法·leetcode
Fleshy数模4 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
踩坑记录4 小时前
leetcode hot100 94. 二叉树的中序遍历 easy 递归 dfs
leetcode
az44yao4 小时前
mysql 创建事件 每天17点执行一个存储过程
mysql
秦老师Q6 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
醉颜凉6 小时前
【LeetCode】打家劫舍III
c语言·算法·leetcode·树 深度优先搜索·动态规划 二叉树
达文汐6 小时前
【困难】力扣算法题解析LeetCode332:重新安排行程
java·数据结构·经验分享·算法·leetcode·力扣
一匹电信狗6 小时前
【LeetCode_21】合并两个有序链表
c语言·开发语言·数据结构·c++·算法·leetcode·stl
User_芊芊君子6 小时前
【LeetCode经典题解】搞定二叉树最近公共祖先:递归法+栈存路径法,附代码实现
算法·leetcode·职场和发展
培风图南以星河揽胜6 小时前
Java版LeetCode热题100之零钱兑换:动态规划经典问题深度解析
java·leetcode·动态规划