Leetcode 550游戏玩法分析

1.题目

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

2.数据准备

 

Create table If Not Exists Activity (player_id int, device_id int, event_date date, games_played int);
Truncate table Activity;
insert into Activity (player_id, device_id, event_date, games_played) values ('1', '2', '2016-03-01', '5');
insert into Activity (player_id, device_id, event_date, games_played) values ('1', '2', '2016-03-02', '6');
insert into Activity (player_id, device_id, event_date, games_played) values ('2', '3', '2017-06-25', '1');
insert into Activity (player_id, device_id, event_date, games_played) values ('3', '1', '2016-03-02', '0');
insert into Activity (player_id, device_id, event_date, games_played) values ('3', '4', '2018-07-03', '5');

3.方法一:从连续登录天数切入

—534 ms击败86.77%

  • 思路
    • t1: 给每个玩家分配登录顺序(rn)。
    • t2: 计算每个玩家的差异日期,用 rn 减去当前的 event_date,计算出连续登录的情况。
    • t3: 计算每个玩家在相同的日期差异下的登录次数(ct),找到有两天连续登录的玩家。
    • t4: 统计首次登录且在次日(第二天)登录的玩家数。
    • t5: 统计总玩家数。
    • 最终结果: 计算并输出次日留存率。

 

WITH t1 AS (
    SELECT 
        player_id,
        event_date,
        ROW_NUMBER() OVER (PARTITION BY player_id ORDER BY event_date) AS rn
    FROM activity
),
t2 AS (
    SELECT 
        player_id
    FROM t1
    WHERE rn = 1 -- 首次登录
),
t3 AS (
    SELECT 
        t1.player_id
    FROM t1
    JOIN t1 AS t1_next 
        ON t1.player_id = t1_next.player_id 
        AND DATEDIFF(t1_next.event_date, t1.event_date) = 1  -- 间隔1天
        AND t1.rn = 1  -- 第一次登录当天
),
t4 AS (
    SELECT COUNT(DISTINCT player_id) AS retention_count FROM t3
),
t5 AS (
    SELECT COUNT(DISTINCT player_id) AS total_players FROM t2
)
SELECT 
    ROUND(t4.retention_count / t5.total_players, 2) AS fraction
FROM t4, t5;

4.方法二:找出与首次登陆日间隔1天的登陆日

—519 ms击败95.81%

  • 计算首次登录的玩家中,第二天再次登录的比例(次日留存率),思路是找出从首次登录到次日仍然活跃的玩家。
  • 上一个方法旨在寻找连续登录的天数,但其实可以直接在 t1 基础上处理登录间隔为 1 天的玩家。
  • 思路
    • t1: 给每个玩家的每次登录打上序号 rn
    • t2: 找出首次登录的玩家。
    • t3: 找出那些首次登录后 第二天再次登录 的玩家(DATEDIFF = 1)。
    • t4: 计算次日留存的玩家数。
    • t5: 计算总玩家数。
    • 最终结果: 计算次日留存率,并四舍五入保留两位小数。

 

WITH t1 AS (
    SELECT 
        player_id,
        event_date,
        ROW_NUMBER() OVER (PARTITION BY player_id ORDER BY event_date) AS rn
    FROM activity
),
t2 AS (
    SELECT 
        player_id
    FROM t1
    WHERE rn = 1 -- 首次登录
),
t3 AS (
    SELECT 
        t1.player_id
    FROM t1
    JOIN t1 AS t1_next 
        ON t1.player_id = t1_next.player_id 
        AND DATEDIFF(t1_next.event_date, t1.event_date) = 1  -- 间隔1天
        AND t1.rn = 1  -- 第一次登录当天
),
t4 AS (
    SELECT COUNT(DISTINCT player_id) AS retention_count FROM t3
),
t5 AS (
    SELECT COUNT(DISTINCT player_id) AS total_players FROM t2
)
SELECT 
    ROUND(t4.retention_count / t5.total_players, 2) AS fraction
FROM t4, t5;

5.可延申思考方向

游戏业务分析可太多可以分析的方向了,下面列了几点,供大家参考,可以浅码一下,这几天找找相关题目会做一下分享~

  • 首次登录玩家的活跃度分析

    计算首次登录的玩家在首次登录后第七天内的登录次数,报告这些玩家的登录次数的平均值。

  • 活跃玩家比例

    计算在首次登录后的第30天内,至少登录过一次的玩家数量与首次登录的玩家总数的比率。

  • 每日新增玩家数量

    按天统计每天首次登录的玩家数量,报告最近一个月每天新增玩家的变化趋势。

  • 玩家留存率

    计算首次登录后第1天、第7天和第30天的留存率,展示各个时间点的留存率变化。

  • 流失玩家分析

    找出在首次登录后未登录超过30天的玩家,并计算流失率。

  • 频繁登录玩家的分析

    统计在首次登录后,登录次数超过10次的玩家的数量及其占比。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值