You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
select
first_date as install_dt,
count(*) installs,
round(count(activity.event_date) /count(*), 2) as day1_retention
from (
select
player_id,
min(event_date) as first_date
from activity group by player_id
) t1 left join activity
ont1.player_id=activity.player_idand datediff(activity.event_date, t1.first_date) =1group by first_date;
解析
每个玩家第一个登录日,作为 t1 表
select
player_id,
min(event_date) as first_date
from activity group by player_id;
需要得到每个玩家第一个登陆日之后第二天有没有登录
将 t1 表和 activity 左连
这要注意输出的字段 event_date 是第一天登录之后第二天又登录的玩家日期
select*from t1
left join activity
ont1.player_id=activity.player_idand datediff(activity.event_date, t1.first_date) =1;
查询 t1 和 activity 左连后的表,按照第一个登陆日进行分组 first_date
count(*) 第一个登陆日的总人数
count(activity.event_date) 第二个登录日的人数
a/b 是第一天玩家的留存率
SQL:方法二
select
first_date as install_dt,
count(distinct player_id) as installs,
round(
sum(if(date_add(first_date, interval 1 day) = event_date, 1, 0))
/count(distinct player_id),
2) as day1_retention
from (
select
player_id,
event_date,
min(event_date) over(partition by player_id) as first_date
from activity
) t1 group by first_date;
解析
方法二的思路和方法一是一样的,使用了窗口函数代替了分组。
使用窗口函数,计算出每个玩家的第一次登录日期,作为临时表 t1
select
player_id,
event_date,
min(event_date) over(partition by player_id) as first_date
from activity;
select
first_date as install_dt,
count(a1.event_date) as installs,
round(
sum(if(datediff(a2.event_date, a1.event_date) =1, 1, 0))
/count(a1.event_date),
2) as day1_retention
from (
select
player_id,
min(event_date) first_date
from activity group by player_id
) t1
left join activity a1 ont1.player_id=a1.player_idandt1.first_date=a1.event_dateleft join activity a2 ona1.player_id=a2.player_idand datediff(a2.event_date, a1.event_date) =1group by first_date;
题目
题目链接:游戏玩法分析 V
玩家的安装日期
event_date
定义为该玩家的第一个登录日。玩家的
第一天留存率
定义为:假定安装日期为X
的玩家的数量为N
,其中在X
之后的一天重新登录的玩家数量为M
,M/N
就是第一天留存率,四舍五入到小数点后两位。编写一个 SQL 查询,报告所有安装日期、当天安装游戏的玩家数量和玩家的第一天留存率。
分析
需要几个值
SQL:方法一
解析
每个玩家第一个登录日,作为
t1
表需要得到每个玩家第一个登陆日之后第二天有没有登录
t1
表和activity
左连event_date
是第一天登录之后第二天又登录的玩家日期查询
t1
和activity
左连后的表,按照第一个登陆日进行分组first_date
count(*)
第一个登陆日的总人数count(activity.event_date)
第二个登录日的人数a/b
是第一天玩家的留存率SQL:方法二
解析
方法二的思路和方法一是一样的,使用了窗口函数代替了分组。
使用窗口函数,计算出每个玩家的第一次登录日期,作为临时表
t1
输出
查询
t1
,按照first_date
进行分组count(distinct player_id)
第一个登陆日的总人数sum(if(date_add(first_date, interval 1 day) = event_date, 1, 0))
date_add(first_date, interval 1 day) = event_date
第一个登陆日后一天也登录的用户sum(if(expr, 1, 0))
或者count(if(expr, 1, null))
,使用sum
求和if
表达式的false
应该用0
,使用count
求和if
表达式的false
应该用null
,因为count
会忽略null
SQL:方法三
解析
activity
表自身左连2
次筛选出第一天登录的玩家,第二天也登录了
datediff(a2.event_date, a1.event_date) = 1
筛选出第一个登录日,因为
a1.event_date > a3.event_date
,所以第一个登录日a3.event_date
为null
合并第一步和第二步
计算出对应的值
a1.event_date
是第一个登录日count(a1.event_date)
第一个登录日的总人数sum(if(datediff(a2.event_date, a1.event_date) = 1, 1, 0))
第一个登录日的第二天登录的总人数b/c
是第一天玩家的留存率SQL:方法四
解析
方法四和方法三是一个思路,不同都是查询第一个登录日,用下面的方法代替方法三中的第二步,方法三中的第二步迷惑性很大,不太好理解。
The text was updated successfully, but these errors were encountered: