返回

SQL大厂面试真题解析:用户增长场景-连续签到领金币

后端

数据分析技巧:计算信息流平台连续签到活动中的用户金币奖励

前言

在信息流平台上,连续签到是吸引用户参与、提升活跃度和留存率的常见活动。平台通常会提供金币奖励来鼓励用户每日签到。作为技术专家,我们需要掌握连续签到场景下的数据分析方法,以便更好地评估活动效果,优化用户体验。

问题陈述

某信息流平台开展了一项连续签到领金币活动,从 2021 年 7 月 1 日持续到 10 月 31 日。活动规则如下:

  • 用户每天签到可获得 10 金币。
  • 连续签到 7 天可额外获得 10 金币。
  • 连续签到 14 天可额外获得 20 金币。
  • 连续签到 21 天可额外获得 30 金币。
  • 连续签到 28 天可额外获得 50 金币。

我们使用签到记录表进行分析,其中包含以下字段:

  • uid:用户 ID
  • artical_id:文章 ID
  • in_time:进入时间
  • out_time:离开时间
  • sign_in:是否签到

任务是计算每个用户 2021 年 7 月以来每月获得的金币数,但需要注意,该活动在 10 月底结束,11 月 1 日开始的签到不再获得金币。

数据分析方法

为了解决这个问题,我们需要进行以下步骤:

  1. 提取连续签到记录:
    • 使用临时表 ContinuousSign 提取 2021 年 7 月至 10 月期间的签到记录。
  2. 计算每日签到次数:
    • 创建临时表 DailySign,计算每个用户每日的签到次数。
  3. 计算连续签到天数:
    • 创建临时表 ContinuousSignDays,计算每个用户每天连续签到的天数。
  4. 计算每月获得的金币数:
    • 按照活动规则,计算每个用户每月获得的金币数。

SQL 查询示例

-- 创建临时表,提取连续签到记录
CREATE TEMP TABLE ContinuousSign AS (
    SELECT
        uid,
        artical_id,
        in_time,
        out_time,
        sign_in,
        DATE(in_time) AS sign_date  -- 计算签到日期
    FROM
        签到记录表
    WHERE
        DATE(in_time) BETWEEN '2021-07-01' AND '2021-10-31'  -- 筛选2021年7月至10月的签到记录
);

-- 计算每个用户每日签到次数
CREATE TEMP TABLE DailySign AS (
    SELECT
        uid,
        sign_date,
        COUNT(DISTINCT artical_id) AS sign_count  -- 统计每日签到次数
    FROM
        ContinuousSign
    GROUP BY
        uid,
        sign_date
);

-- 计算每个用户每月连续签到天数
CREATE TEMP TABLE ContinuousSignDays AS (
    SELECT
        uid,
        sign_date,
        SUM(sign_count) OVER (PARTITION BY uid ORDER BY sign_date ASC) AS continuous_days  -- 计算连续签到天数
    FROM
        DailySign
);

-- 计算每个用户每月获得的金币数
SELECT
    uid,
    strftime('%Y-%m', sign_date) AS sign_month,  -- 提取签到月份
    SUM(CASE
        WHEN continuous_days >= 28 THEN 50  -- 连续签到28天奖励50金币
        WHEN continuous_days >= 21 THEN 30  -- 连续签到21天奖励30金币
        WHEN continuous_days >= 14 THEN 20  -- 连续签到14天奖励20金币
        WHEN continuous_days >= 7 THEN 10   -- 连续签到7天奖励10金币
        ELSE 0  -- 其他情况不奖励金币
    END) AS金币奖励
FROM
    ContinuousSignDays
GROUP BY
    uid,
    sign_month
ORDER BY
    uid,
    sign_month;

示例输出

uid sign_month 金币奖励
1 2021-07 100
1 2021-08 120
1 2021-09 140
1 2021-10 160
2 2021-07 80
2 2021-08 100
2 2021-09 120
2 2021-10 140
3 2021-07 60
3 2021-08 80
3 2021-09 100
3 2021-10 120

总结

通过分析连续签到场景下的签到记录,我们可以计算出每个用户每月获得的金币数。掌握 SQL 查询技巧,有助于我们更好地应对相关面试挑战,为信息流平台的用户增长提供数据支持。

常见问题解答

  1. 如何优化 SQL 查询以提高性能?

    • 使用索引以加快数据检索。
    • 使用临时表或视图以避免重复查询。
    • 优化查询逻辑,例如使用 CASE 语句而不是多个 IF 语句。
  2. 如何处理缺失或不完整的签到记录?

    • 在分析之前,对数据进行预处理以填充或删除缺失值。
    • 考虑使用窗口函数来处理连续签到天数等累积值。
  3. 如何可视化金币奖励数据?

    • 使用折线图或条形图显示每个用户每月获得的金币数。
    • 使用散点图分析用户金币奖励与其他指标(例如参与度)之间的相关性。
  4. 如何使用这些分析结果优化连续签到活动?

    • 确定奖励结构的有效性并根据需要进行调整。
    • 识别不活跃用户并实施策略以重新吸引他们。
    • 根据用户行为模式细分用户,并针对每个细分提供定制的奖励。
  5. 除了金币奖励外,还有哪些其他策略可以提升用户参与度?

    • 提供每日任务、里程碑奖励或排行榜以激发竞争。
    • 使用推送通知或电子邮件提醒用户签到或参与活动。
    • 创建社区或论坛,促进用户之间的互动和参与。