留存率计算

---用户注册日期表
drop table if exists ads_register;
create table ads_register(
    id string,
    rg_ts string
)
;

insert overwrite table ads_register
select 1,'2024-04-29 19:28:00' union all
select 2,'2024-05-30 19:25:00' union all
select 3,'2024-08-03 21:05:00' 
;

--用户访问日期表
drop table if exists ads_activity;
create table ads_activity(
    id string,
    ts string
)
;

insert overwrite table ads_activity
select 1,'2024-05-01 19:28:00' union all
select 1,'2024-05-02 19:53:00' union all
select 1,'2024-05-03 22:00:00' union all
select 1,'2024-05-05 20:55:00' union all
select 1,'2024-05-06 21:58:00' union all
select 2,'2024-06-01 19:25:00' union all
select 2,'2024-06-02 21:00:00' union all
select 2,'2024-06-04 22:05:00' union all
select 2,'2024-06-05 20:59:00' union all
select 2,'2024-06-06 19:05:00' union all
select 3,'2024-08-04 21:05:00' union all
select 3,'2024-08-05 19:10:00' union all
select 3,'2024-08-06 19:55:00' union all
select 3,'2024-08-07 21:05:00' 
;

----留存率
select 
 count(distinct a.id) as tot_id
,count(distinct case when datediff(get_date(b.ts),get_date(a.rg_ts))  = 1 then a.id end)*1.0 / count(distinct a.id) as 1d_retent_rate
,count(distinct case when datediff(get_date(b.ts),get_date(a.rg_ts))  = 2 then a.id end)*1.0 / count(distinct a.id) as 2d_retent_rate
,count(distinct case when datediff(get_date(b.ts),get_date(a.rg_ts))  = 3 then a.id end)*1.0 / count(distinct a.id) as 3d_retent_rate
,count(distinct case when datediff(get_date(b.ts),get_date(a.rg_ts))  = 4 then a.id end)*1.0 / count(distinct a.id) as 4d_retent_rate
from ads_register a
left join ads_activity b
on a.id = b.id
where b.ts > a.rg_ts

### 用户留存率计算方法 在 MySQL 中实现用户留存率计算可以通过 SQL 查询完成。以下是具体的实现方式: #### 数据准备 假设有一个名为 `t_user_login` 的表,其中包含两个字段:`user_id` 和 `login_time`[^2]。 #### 计算逻辑 为了计算用户的留存率,通常需要以下几个步骤: 1. **定义基准日期**:选取某个特定日期作为基准日期。 2. **匹配后续登录记录**:对于每个用户,在其首次登录后的第 N 天查找是否有再次登录的行为。 3. **统计留存人数**:分别统计每天的总用户数以及满足条件的留存用户数。 4. **计算比率**:通过公式 `(留存用户数 / 总用户数)` 得到每一天的留存率。 #### 实现代码 以下是一个完整的 SQL 脚本用于计算 7 日内的用户留存率: ```sql WITH first_logins AS ( SELECT user_id, MIN(login_time) as first_login_date FROM t_user_login GROUP BY user_id ), retention_days AS ( SELECT fl.user_id, DATEDIFF(l.login_time, fl.first_login_date) AS retention_day FROM first_logins fl JOIN t_user_login l ON fl.user_id = l.user_id AND l.login_time >= fl.first_login_date WHERE DATEDIFF(l.login_time, fl.first_login_date) BETWEEN 1 AND 7 -- 只考虑前7天的数据 ) SELECT retention_day, COUNT(DISTINCT user_id) AS retained_users FROM retention_days GROUP BY retention_day; ``` 上述脚本分为三个部分: 1. 使用 `MIN()` 函数获取每位用户的第一次登录日期,并将其存储在一个临时表 `first_logins` 中。 2. 将原始表与 `first_logins` 表连接起来,筛选出每次登录距离首次登录的时间差(即 `DATEDIFF`),并限定范围为 1 到 7 天。 3. 统计每一天的留存用户数量。 #### 结果解释 最终的结果会显示每一天的留存用户数。如果想进一步得到百分比形式的留存率,则可以在外部再嵌套一层查询来除以总的注册用户数。 --- ### Python 辅助处理 当数据量较大或者需要更加灵活的操作时,可以利用 Python 进行辅助处理。例如,将 MySQL 数据导出至 Pandas DataFrame 后执行复杂运算[^3]: ```python import pandas as pd from sqlalchemy import create_engine # 建立数据库连接 engine = create_engine('mysql+pymysql://username:password@host/dbname') # 导入数据 query = """ SELECT user_id, login_time FROM t_user_login """ data = pd.read_sql(query, engine) # 添加首登标记 data['first_login'] = data.groupby('user_id')['login_time'].transform('min') data['days_since_first_login'] = (data['login_time'] - data['first_login']).dt.days # 筛选前7天的数据 retained_data = data[(data['days_since_first_login'] >= 1) & (data['days_since_first_login'] <= 7)] # 按天统计留存用户数 retention_counts = retained_data.groupby('days_since_first_login')['user_id'].nunique().reset_index() print(retention_counts) ``` 此代码片段实现了从 MySQL 提取数据并通过 Pandas 执行类似的留存率计算过程。 --- ### 注意事项 - 如果涉及大量历史数据,建议优化索引结构以提高性能[^1]。 - 对于更复杂的业务需求(如分组维度增加),可能还需要引入额外的聚合函数或窗口函数[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值