leetcode1079:游戏玩法分析——求留存率

求留存率

题目描述

表:Activity

±-------------±--------+

| Column Name | Type |

±-------------±--------+

| player_id | int |

| device_id | int |

| event_date | date |

| games_played | int |

±-------------±--------+

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

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

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

玩家的 安装日期 定义为该玩家的第一个登录日。

我们将日期 x 的 第一天留存率 定义为:假定安装日期为 X 的玩家的数量为 N ,其中在 X 之后的一天重新登录的玩家数量为 M,M/N 就是第一天留存率,四舍五入到小数点后两位。

编写解决方案,报告所有安装日期、当天安装游戏的玩家数量和玩家的 第一天留存率。

以 任意顺序 返回结果表。

结果格式如下所示。

题解

t1:查询所有玩家首次安装游戏的时间

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

t2:查询当天安装该游戏的玩家数量

sql 复制代码
select t1.install_dt,
count(player_id) as installs
from 
    (select
    player_id,
    min(event_date) as install_dt
    from Activity
    group by player_id) t1

t3:查询安装第二天仍然登录游戏的玩家

sql 复制代码
select 
t1.install_dt,
count(a.player_id) as Day1_nums
from Activity a
left join 
    (select
    player_id,
    min(event_date) as install_dt
    from Activity
    group by player_id) t1
on a.event_date = date_add(t1.install_dt,interval 1 day)
and a.player_id = t1.player_id
where install_dt is not null
group by install_dt

将以上进行综合,并用t3中的第二天仍登录数量/首次登录的玩家数量,等于留存率。

即最终代码如下:

sql 复制代码
select t1.install_dt,
count(player_id) as installs,
ifnull(round(Day1_nums/count(player_id),2),0) as Day1_retention
from 
    (select
    player_id,
    min(event_date) as install_dt
    from Activity
    group by player_id) t1
left join
(
select 
t1.install_dt,
count(a.player_id) as Day1_nums
from Activity a
left join 
    (select
    player_id,
    min(event_date) as install_dt
    from Activity
    group by player_id) t1
on a.event_date = date_add(t1.install_dt,interval 1 day)
and a.player_id = t1.player_id
where install_dt is not null
group by install_dt) t3
on t1.install_dt = t3.install_dt
group by t1.install_dt

题目来源:力扣

相关推荐
3***g2058 分钟前
redis连接服务
数据库·redis·bootstrap
AI科技星10 分钟前
光速飞行器动力学方程的第一性原理推导、验证与范式革命
数据结构·人工智能·线性代数·算法·机器学习·概率论
橘颂TA12 分钟前
【剑斩OFFER】算法的暴力美学——leetCode 946 题:验证栈序列
c++·算法·leetcode·职场和发展·结构与算法
闻缺陷则喜何志丹14 分钟前
【状态机动态规划】3686. 稳定子序列的数量|1969
c++·算法·动态规划·力扣·状态机动态规划
m0_5981772316 分钟前
SQL 方法函数(1)
数据库
oMcLin17 分钟前
如何在Oracle Linux 8.4上通过配置Oracle RAC集群,确保企业级数据库的高可用性与负载均衡?
linux·数据库·oracle
信创天地17 分钟前
核心系统去 “O” 攻坚:信创数据库迁移的双轨运行与数据一致性保障方案
java·大数据·数据库·金融·架构·政务
胖咕噜的稞达鸭20 分钟前
进程间的通信(1)(理解管道特性,匿名命名管道,进程池,systeam V共享内存是什么及优势)重点理解代码!
linux·运维·服务器·数据库
德彪稳坐倒骑驴24 分钟前
Sqoop入门常用命令
数据库·hadoop·sqoop
资深web全栈开发25 分钟前
pg on delete 策略探讨
数据库·pg