游戏玩法分析五:按安装日统计次日留存
LeetCode 1097 · 安装日、次日留存、分组比率
面试怎么回答
用 MIN(event_date) OVER (PARTITION BY player_id) 得到每个玩家的安装日,按安装日分组:COUNT(DISTINCT player_id) 是安装数,SUM(DATEDIFF(event_date, install_dt) = 1) 是次日回来的人数,相除再 ROUND。这是做留存分析最常用的「先打安装日标签、再分组」思路。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
玩家的安装日期定义为他第一次登录的日期。对每个安装日期,输出当天安装的玩家数,以及这些玩家中第二天又登录的比例(保留两位小数)。
表结构
- Activity:player_id、device_id、event_date、games_played;(player_id, event_date) 为主键
思路
先用窗口 MIN 给每条记录挂上这个玩家的安装日,然后按安装日分组:安装人数是不同玩家数;留存人数是「登录日期 = 安装日 + 1」的记录数(每个玩家每天最多一条,所以就是人数),两者相除。
参考解法
select install_dt,count(distinct player_id)installs,
round(sum(if(datediff(event_date,install_dt)=1,1,0))/count(distinct player_id),2) Day1_retention
from
(
select *,min(event_date) over(partition by player_id) install_dt
from Activity
)t1
group by install_dt
易错点
- 用 COUNT(*) 当安装人数会把玩家的多天记录都算进去,必须 COUNT(DISTINCT player_id)。
- 留存的分母是当天安装的人数,不是当天登录的人数。