订阅更新

游戏玩法分析五:按安装日统计次日留存

SQL 实战 123 题 · 第 58 题 困难 约 2 分钟读完

LeetCode 1097 · 安装日、次日留存、分组比率

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

用 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)。
  • 留存的分母是当天安装的人数,不是当天登录的人数。
刷题进度保存在当前浏览器