SQL计算留存率

Posted ShenLiang2025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL计算留存率相关的知识,希望对你有一定的参考价值。

用SQL计算用户的留存率

需求描述

有用户活跃表dws_user_active_t,它的字段有:

ds '操作日期'

device  '设备类型' 1 手机 2 PAD 3 浏览器 

user_id '用户id'

active_score  '活跃度'

计算出用户留存率(公式见下):

留存率=(昨天活跃用户∩今天活跃用户)/昨天活跃用户。

示例数据

问题分析

留存率的计算主要涉及到一个时间参数,而与之对比的时间则是昨天,简单的说即取昨天的用户里仍然在今天活跃的比率。

SQL代码

-- 提供个mysql版的供参考,ORACLE时间函数需做相应替换。
WITH dws_user_active_t AS
(SELECT '20211012' ds,1 device,100 user_id,30 active_score UNION
SELECT '20211012' ds,2 device,101 user_id,30 active_score UNION
SELECT '20211012' ds,1 device,102 user_id,20 active_score UNION
SELECT '20211013' ds,1 device,103 user_id,10 active_score UNION
SELECT '20211013' ds,2 device,102 user_id,60 active_score UNION
SELECT '20211013' ds,1 device,104 user_id,90 active_score UNION
SELECT '20211013' ds,3 device,101 user_id,85 active_score 
), middle AS(
	SELECT COUNT(DISTINCT CASE WHEN flag = 0 THEN  user_id END) yesterday,
	COUNT(DISTINCT CASE WHEN flag = 1 THEN  user_id END ) today,
	COUNT(DISTINCT CASE WHEN flag = 0 THEN  user_id END) +
	COUNT(DISTINCT CASE WHEN flag = 1 THEN  user_id END )-
	COUNT(DISTINCT user_id ) preserved,
	COUNT(DISTINCT user_id ) unique_twodays
	FROM
	(
		SELECT * ,
		CASE WHEN A.ds =DATE_FORMAT(now(),'%Y%m%d') THEN 1 ELSE 0 END AS flag
		FROM dws_user_active_t A
		WHERE 
		A.ds >= DATE_FORMAT(ADDDATE(now(), INTERVAL -1 DAY),'%Y%m%d')
		AND A.ds <=DATE_FORMAT(now(),'%Y%m%d')
	)A
)

-- 1 生成留存率
SELECT preserved/yesterday preserverate,A.* 
FROM middle A;

以上是关于SQL计算留存率的主要内容,如果未能解决你的问题,请参考以下文章

SQL计算留存率

在 SQL 中的日期之间每天计算用户留存率

30日留存率怎么写

留存率计算

用户留存率计算

hive关于用户留存率的计算