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计算留存率的主要内容,如果未能解决你的问题,请参考以下文章