【Hive SQL 每日一题】统计用户留存率

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
大数据开发治理平台 DataWorks,不限时长
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 用户留存率是衡量产品成功的关键指标,表示用户在特定时间内持续使用产品的比例。计算公式为留存用户数除以初始用户数。例如,游戏发行后第一天有10000玩家,第七天剩5000人,第一周留存率为50%。提供的SQL代码展示了如何根据用户活动数据统计每天的留存率。需求包括计算系统上线后的每日留存率,以及从第一天开始的累计N日留存率。通过窗口函数`LAG`和`COUNT(DISTINCT user_id)`,可以有效地分析用户留存趋势。

@[toc]

用户留存率

用户留存率(User Retention Rate)是一个衡量用户在特定时间段内继续使用某个产品或服务的比例的指标。

它反映了用户对产品的持续兴趣和满意度,是评估产品成功与否的重要指标之一。用户留存率通常以百分比表示,并且可以按天、周、月等时间单位进行计算。

计算用户留存率的基本公式是:

image.png

假设你是一家游戏开发公司,在游戏发布后第一天有 10000 名玩家下载并开始玩游戏。到第七天还有 5000 名玩家在继续玩这个游戏,那么第一周的用户留存率如下:

image.png

测试数据

DROP TABLE IF EXISTS user_activity;
CREATE TABLE user_activity (
    user_id INT,
    activity_date DATE
);

INSERT INTO user_activity (user_id, activity_date) VALUES
(1, '2024-05-10'),
(1, '2024-05-11'),
(1, '2024-05-15'),
(2, '2024-05-10'),
(2, '2024-05-11'),
(2, '2024-05-12'),
(2, '2024-05-16'),
(3, '2024-05-10'),
(3, '2024-05-11'),
(3, '2024-05-13'),
(3, '2024-05-15'),
(4, '2024-05-10'),
(4, '2024-05-11'),
(4, '2024-05-12'),
(4, '2024-05-13'),
(4, '2024-05-14'),
(5, '2024-05-10'),
(5, '2024-05-11'),
(5, '2024-05-12'),
(5, '2024-05-13'),
(5, '2024-05-16'),
(6, '2024-05-10'),
(6, '2024-05-12'),
(6, '2024-05-14'),
(6, '2024-05-16');

需求说明

统计系统上线后每天的用户留存率(假设该系统上线时间为 2024-05-10)。

结果示例:

activity_date user_retention_rate
2024-05-11 83%
2024-05-12 80%
... ...

结果按 activity_date 升序排列

其中:

  • activity_date 统计的日期;
  • user_retention_rate 当天的用户留存率。

需求实现

select
    activity_date,
    concat(cast(user_count/lag_user_count as decimal(5,2)) * 100,"%") user_retention_rate
from
    (select
        activity_date,
        user_count,
        lag(user_count,1,0) over(order by activity_date) lag_user_count
    from
       (select
          activity_date,
          count(distinct user_id) user_count
        from
          user_activity
        group by
          activity_date)t1 )t2;

实现用户留存率的需求其实很简单,这里要求在系统上线后,统计每天的用户留存率,我们每次只需要算出“今天”的用户数量与“昨天”的用户数量比例即可。

首先,取到每天登录的用户数量:

select
    activity_date,
    count(distinct user_id) user_count
from
    user_activity
group by
    activity_date;

这里每个用户可能在当天登录多次,所以需要进行去重统计。

image.png

接下来只需要获取到隔日的用户登录人数,然后求两者的比例即可得到用户的留存率:

select
    activity_date,
    user_count,
    lag(user_count,1,0) over(order by activity_date) lag_user_count
from
   (select
      activity_date,
      count(distinct user_id) user_count
    from
      user_activity
    group by
      activity_date)t1;

这里通过 lag 窗口函数来获取上一天的用户登录人数,如果是系统上线第一天,则没有上一天,用 0 表示。

image.png

最后,求出当天与上一天的用户比例即可:

select
    activity_date,
    concat(cast(user_count/lag_user_count as decimal(5,2)) * 100,"%") user_retention_rate
from
    (select
        activity_date,
        user_count,
        lag(user_count,1,0) over(order by activity_date) lag_user_count
    from
       (select
          activity_date,
          count(distinct user_id) user_count
        from
          user_activity
        group by
          activity_date)t1 )t2;

输出结果如下:

image.png

最终得到的结果是每天的次日留存率趋势,因为我们每次取的数据都是当日与次日的比例。

这里变换一下需求,求系统上线第 n 天的用户留存率,也就是说,后续的留存率,都是基于首日的登录人数来进行计算的,如下所示:

假设第一天登录 6 人,第二天登录人数 3 人,那么 1 日留存率为:3/6=50%
假设第一天登录 6 人,第三天登录人数 2 人,那么 2 日留存率为:2/6=34%
假设第一天登录 6 人,第四天登录人数 4 人,那么 3 日留存率为:4/6=67%
......

select
    activity_date,
    datediff(activity_date,"2024-05-10") date_diff_num,
    concat(cast(user_count/first_user_count as decimal(5,2)) * 100,"%") user_retention_rate
from
   (select
      1 a,
      count(distinct user_id) first_user_count
    from
      user_activity
    where
      activity_date = "2024-05-10")t1
join
   (select
      1 a,
      activity_date,
      count(distinct user_id) user_count
    from
      user_activity
    where
      activity_date != "2024-05-10"
    group by
      activity_date)t2
on
  t1.a = t2.a;

t1 查询中,去重统计出系统上线首日的用户登录人数;

t2 查询中,按日期聚合去重统计除首日外的每日用户登录人数;

设立一个为真的连接条件,将数据进行组合,计算第 n 日的用户留存率。

最终结果如下所示:

image.png

相关文章
|
1月前
|
SQL HIVE
【Hive SQL 每日一题】环比增长率、环比增长率、复合增长率
该文介绍了环比增长率、同比增长率和复合增长率的概念及计算公式,并提供了SQL代码示例来计算商品的月度增长率。环比增长率是相邻两期数据的增长率,同比增长率是与去年同期相比的增长率,复合增长率则是连续时间段内平均增长的速率。文章还包含了一组销售数据用于演示如何运用这些增长率进行计算。
|
1月前
|
SQL HIVE
【Hive SQL】字符串操作函数你真的会用吗?
本文介绍了SQL中判断字符串是否包含子串的几种方法。`IN`函数判断元素是否完全等于给定元素组中的某项,而非包含关系。`INSTR`和`LOCATE`函数返回子串在字符串中首次出现的位置,用于检测是否存在子串。`SUBSTR`则用于提取字符串的子串。`LIKE`用于模糊匹配,常与通配符配合使用。注意`IN`并非用于判断子串包含。
|
15天前
|
SQL Oracle 关系型数据库
SQL 面试系列(一)【留存率问题】
SQL 面试系列(一)【留存率问题】
|
30天前
|
SQL HIVE
【Hive SQL 每日一题】统计用户连续下单的日期区间
该SQL代码用于统计用户连续下单的日期区间。首先按`user_id`和`order_date`分组并去除重复,然后使用`row_number()`标记行号,并通过`date_sub`与行号计算潜在的连续日期。接着按用户ID和计算后的日期分组,排除连续订单数少于2的情况,最后提取连续下单的起始和结束日期。输出结果展示了用户连续下单的日期范围。
|
1月前
|
SQL 关系型数据库 HIVE
【Hive SQL 每日一题】统计最近1天/7天/30天商品的销量
这段内容是关于SQL查询的示例,目标是统计`sales`表中最近1天、7天和30天的商品销量和销售次数。表结构包含`id`、`product_id`、`quantity`和`sale_date`字段。初始查询方法通过三个独立的子查询完成,但效率较低。优化后的查询使用了`lateral view explode`将数据炸裂,通过一次查询同时获取所有所需时间段的数据,提高了效率。示例中展示了优化前后的SQL代码及结果对比。
|
1月前
|
SQL HIVE
【Hive SQL 每日一题】统计最近7天内连续下单3日的用户量
创建了一个名为`sales`的测试表,包含`user_id`、`product_id`、`quantity`和`sale_date`字段,插入了多条销售数据。需求是找出最近7天内连续下单3天的用户数量。SQL查询通过分组和窗口函数`row_number()`检查日期连续性,最终计算满足条件的唯一用户数。示例结果显示有3名用户符合条件。
|
8天前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
16天前
|
SQL DataWorks NoSQL
DataWorks产品使用合集之如何将SQL Server中的数据转存到MongoDB
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
243 1
|
1月前
|
SQL API 流计算
实时计算 Flink版产品使用合集之在Mac M1下的Docker环境中开启SQL Server代理的操作步骤是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
162 1
|
9天前
|
SQL 存储 关系型数据库
关系型数据库中的SQL Server
【6月更文挑战第11天】
44 3