SQL练习七—留存率问题

目录

一 如何计算留存率

1.先把想要的数据提取出来观察:用户id、日期、次日日期

2.留存情况:我们希望当前日期和次日日期对应起来

3.留存率计算:留存的(有次日信息)/全部 

4.整理思路,代码优化

 二 留存率实战练习—2021年11月每天新用户的次日留存率

一 如何计算留存率
  • 公式:留存率 = (留存用户数 / 初始用户数)× 100%。
  • 举例:假设一个应用在第一天有 1000 个新用户注册,到第 7 天时,这 1000 个用户中有 300 个仍然在使用该应用,那么第 7 天的留存率 = (300 / 1000)× 100% = 30%。

问题分析:

1.先把想要的数据提取出来观察:用户id、日期、次日日期

去重:去掉一个用户一日多次登录记录

select distinct device_id,date,date_add(date,interval 1 day)as ciri
from question_practice_detail
order by device_id,date

2.留存情况:我们希望当前日期和次日日期对应起来

如果没有就是次日没来,如果有就代表次日留存

with t1 as(
select distinct device_id,date,date_add(date,interval 1 day)as ciri
from question_practice_detail
order by device_id,date
)
select a.device_id,a.date as '登录日期',b.date as '次日日期' from  t1 as a
left join t1 as b
on a.device_id=b.device_id and a.date+1=b.date

3.留存率计算:留存的(有次日信息)/全部 

  count(次日)/count(device_id)

4.整理思路,代码优化
select round(count(yd)/count(device_id),4) as avg_ret
from(
select distinct q1.device_id as device_id,q1.date as td ,q2.date as yd
from question_practice_detail as q1
left join  question_practice_detail  as q2
on q1.device_id=q2.device_id and q2.date=date_add(q1.date,interval 1 day)
    ) a

 二 留存率实战练习—2021年11月每天新用户的次日留存率

t1:用户,注册日期(最小的登录日期),按日期group 计每日新增用户数 

t2:(用户的登录信息) 用户,登录时间(进出跨天两天都计入)

把这个注册信息和登录信息连接on用户id和日期(检查次日是否登录 注册日期+1=登录日期)

select
    regdt,
    round(count(t3.uid) / count(t2.uid), 2) as uv_left_rate
from
    (
        select
            uid,
            regdt,
            count(uid) over (
                partition by
                    regdt
            ) as uv
        from
            (
                select
                    uid,
                    date (min(in_time)) as regdt
                from
                    tb_user_log
                group by
                    uid
            ) t1
    ) t2
    left join (
        select
            uid,
            date (in_time) as dt
        from
            tb_user_log
        union
        select
            uid,
            date (out_time) as dt
        from
            tb_user_log
    ) t3 on t3.dt = date_add (regdt, interval 1 day)
    and t2.uid = t3.uid
where
    date_format (regdt, '%Y-%m') = '2021-11'
group by
    regdt

### 如何用SQL计算周留存率 为了计算周留存率,可以通过扩展上述提到的日留存逻辑来实现。以下是详细的解释以及相应的 SQL 示例。 #### 数据准备 假设存在一张 `user_log` 表,其中包含以下字段: - `user_id`: 用户唯一标识符。 - `login_time`: 登录时间戳或日期。 目标是计算一周之后仍保持活跃的用户比例。这需要将当前周期内的用户与未来第天再次登录的用户进行匹配。 --- #### 计算周留存率的方法 核心思想是对同一张表执行 **自关联** 操作,并利用日期差函数(如 `DATEDIFF()` 或 `DATE_ADD()`)筛选符合条件的记录: 1. 将原始数据按照 `(user_id, login_time)` 去重,确保每条记录代表一次独立的用户活动。 2. 对去重后的表格进行自关联操作,设置连接条件如下: - `user_id` 相同:表示同一个用户的行为。 - 时间间隔为7天:通过比较两个 `login_time` 字段的时间差是否等于7天完成过滤。 3. 统计满足条件的用户数量并除以初始周期内的总用户数即可得到周留存率。 下面是具体的 SQL 实现代码: ```sql SELECT COUNT(DISTINCT q2.user_id) * 1.0 / COUNT(DISTINCT q1.user_id) AS weekly_retention_rate FROM ( SELECT DISTINCT user_id, DATE(login_time) AS login_date FROM user_log ) AS q1 LEFT JOIN ( SELECT DISTINCT user_id, DATE(login_time) AS login_date FROM user_log ) AS q2 ON q1.user_id = q2.user_id AND DATEDIFF(q2.login_date, q1.login_date) = 7; ``` 在此查询中, - 子查询 `q1` 提取了首次登录的用户及其对应的日期; - 子查询 `q2` 查找这些用户在未来第7天是否有新的登录记录; - 最终结果通过对两组用户的交集大小与起始用户总数之比得出每周留存比率[^4]。 --- #### 注意事项 当实际应用时需要注意一些潜在问题: - 如果数据库中的时间存储格式不是标准日期型,则需先转换成适当的形式再参与运算[^3]。 - 考虑到可能存在多时段重复访问的情况,在初步清理阶段应去除冗余项以免干扰最终统计准确性[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值