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

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 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
开启慢SQL设置long_query_time=0.1为啥会统计的sql却存在小于100毫秒的sql
开启慢SQL设置long_query_time=0.1为啥会统计的sql却存在小于100毫秒的sql
35 1
|
2月前
|
SQL 分布式计算 Hadoop
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
89 3
|
2月前
|
SQL 存储 关系型数据库
mysql 数据库空间统计sql
mysql 数据库空间统计sql
50 0
|
2月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
68 0
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
110 0
|
4月前
|
SQL 存储 分布式计算
插入Hive表数据SQL
【8月更文挑战第10天】
|
4月前
|
SQL 物联网 数据处理
"颠覆传统,Hive SQL与Flink激情碰撞!解锁流批一体数据处理新纪元,让数据决策力瞬间爆表,你准备好了吗?"
【8月更文挑战第9天】数据时代,实时性和准确性至关重要。传统上,批处理与流处理各司其职,但Apache Flink打破了这一界限,尤其Flink与Hive SQL的结合,开创了流批一体的数据处理新时代。这不仅简化了数据处理流程,还极大提升了效率和灵活性。例如,通过Flink SQL,可以轻松实现流数据与批数据的融合分析,无需在两者间切换。这种融合不仅降低了技术门槛,还为企业提供了更强大的数据支持,无论是在金融、电商还是物联网领域,都将发挥巨大作用。
66 6
|
4月前
|
SQL 存储 关系型数据库
SQL SERVER 查询所有表 统计每张表的大小
SQL SERVER 查询所有表 统计每张表的大小
51 0
|
5月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用问题之如何使用Flink SQL连接带有Kerberos认证的Hive
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。