SQL面试题练习 —— 计算次日留存率

题目

现有用户登录记录表,已经按照用户日期进行去重处理。以用户登录的最早日期作为新增日期,请计算次日留存率是多少。

样例数据

+----------+-------------+
| user_id  | login_date  |
+----------+-------------+
| aaa      | 2023-12-01  |
| bbb      | 2023-12-01  |
| bbb      | 2023-12-02  |
| ccc      | 2023-12-02  |
| bbb      | 2023-12-03  |
| ccc      | 2023-12-03  |
| ddd      | 2023-12-03  |
| ccc      | 2023-12-04  |
| ddd      | 2023-12-04  |
+----------+-------------+

样例结果

在这里插入图片描述

建表语句

CREATE TABLE t_login_040 (
  user_id VARCHAR(255) COMMENT '用户ID',
  login_date VARCHAR(255) COMMENT '登录日期'
) COMMENT '用户登录记录表';
insert into t_login_040(user_id,login_date)
values
('aaa','2023-12-01'),
('bbb','2023-12-01'),
('bbb','2023-12-02'),
('ccc','2023-12-02'),
('bbb','2023-12-03'),
('ccc','2023-12-03'),
('ddd','2023-12-03'),
('ccc','2023-12-04'),
('ddd','2023-12-04');

题解

指标定义:

  • 次日留存用户:新增用户第二天登录(活跃)的用户;
  • 次日留存率: t + 1 t+1 t+1日留存用户数 / t t t日新增用户;(注意新增可能为0,要先判断)
select
first_day,
-- 当天新增用户数可能为1
concat(if(count(case when date_diff = 0 then user_id end) =0,0,
					round(count(case when date_diff =1 then user_id end) /count(case when date_diff = 0 then user_id end),1))*100,'%') next_act_per
-- count(case when date_diff = 0 then user_id end) as new_cnt, -- 当天新增用户数
-- count(case when date_diff =1 then user_id end) as next_act_cnt -- 次日登录的用户数
from
(select
  user_id,
  login_date,
-- 	计算出用户的最小登录时间作为新增日期first_day,然后计算当天日期和新增日期的时间差。
  min(login_date) over(partition by user_id order by login_date) first_day,
  datediff(login_date,min(login_date)over(partition by user_id order by login_date)) date_diff
from t_login_040)t
group by first_day
order by first_day;
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: hive中计算次日留存率的代码可能长这样: ``` WITH temp_table AS ( SELECT date, user_id, COUNT(DISTINCT event_name) AS event_count FROM events WHERE event_name = 'register' GROUP BY date, user_id ) SELECT retention_date, retention_count / total_count as retention_rate FROM ( SELECT retention_date, retention_count, total_count, total_count - retention_count as churn_count FROM ( SELECT DATE_ADD(temp_table.date, 1) AS retention_date, COUNT(DISTINCT temp_table.user_id) AS retention_count, COUNT(DISTINCT temp_table.user_id) OVER (PARTITION BY temp_table.date) AS total_count FROM temp_table JOIN events ON temp_table.user_id = events.user_id AND temp_table.date = events.date WHERE events.event_name = 'login' ) ) ``` 第一部分是使用temp_table表,统计每个用户每天的注册次数。 第二部分是将temp_table和event表进行连接,统计昨天注册的用户今天登陆的次数,并计算留存率。 注意:这只是一个示例代码,应该根据您的数据结构和需求进行修改。 ### 回答2: 计算次日留存率,即统计用户在某一天登录后,第二天仍然登录的比例,可以使用Hive编写代码来实现。 假设我们有一个用户登录的数据表login_data,表结构如下: user_id string login_date string 我们首先需要筛选出每个用户的登录日期和第二天的登录日期,并将结果保存到临时表中。代码如下: CREATE TABLE tmp_table AS SELECT user_id, login_date, lag(login_date) OVER(PARTITION BY user_id ORDER BY login_date ASC) AS next_date FROM login_data; 接下来,我们根据第二天的登录日期是否存在来计算次日留存率。如果第二天没有登录记录,则认为用户未次日留存。代码如下: SELECT COUNT(DISTINCT user_id) AS ret_user_count, COUNT(DISTINCT CASE WHEN next_date IS NULL THEN user_id ELSE NULL END) AS non_ret_user_count, COUNT(DISTINCT CASE WHEN next_date IS NOT NULL THEN user_id ELSE NULL END) AS total_user_count, COUNT(DISTINCT CASE WHEN next_date IS NOT NULL AND login_date = next_date THEN user_id ELSE NULL END) AS ret_user_count FROM tmp_table GROUP BY next_date; 上述代码中,ret_user_count表示次日留存用户数,non_ret_user_count表示未次日留存用户数,total_user_count表示总用户数。 最后,我们可以计算次日留存率,即次日留存用户数除以总用户数。代码如下: SELECT ret_user_count / total_user_count AS retention_rate FROM ( SELECT COUNT(DISTINCT CASE WHEN next_date IS NOT NULL AND login_date = next_date THEN user_id ELSE NULL END) AS ret_user_count, COUNT(DISTINCT CASE WHEN next_date IS NOT NULL THEN user_id ELSE NULL END) AS total_user_count FROM tmp_table GROUP BY next_date ); ### 回答3: 在Hive中计算次日留存率,我们可以使用Hive的内置函数和语法来实现。 首先,我们需要确保用户访问数据已经导入到Hive表中。假设我们有一个名为user_logs的表,其中包含用户ID(user_id)和访问日期(visit_date)的字段。 接下来,我们可以使用Hive的语法来编写查询,计算次日留存率。以下是一个可能的实现示例: ```sql -- 选择当天访问过的用户 SELECT DISTINCT user_id FROM user_logs WHERE visit_date = '当前日期'; -- 选择次日仍然访问过的用户 SELECT DISTINCT l.user_id FROM user_logs l JOIN ( -- 当天访问过的用户 SELECT DISTINCT user_id FROM user_logs WHERE visit_date = '当前日期' ) d ON l.user_id = d.user_id WHERE l.visit_date = '次日日期'; -- 计算次日留存率 SELECT COUNT(DISTINCT l.user_id) * 100.0 / COUNT(DISTINCT d.user_id) AS retention_rate FROM user_logs l JOIN ( -- 当天访问过的用户 SELECT DISTINCT user_id FROM user_logs WHERE visit_date = '当前日期' ) d ON l.user_id = d.user_id WHERE l.visit_date = '次日日期'; ``` 在上面的代码中,我们先选择当天访问过的用户,然后通过将用户ID与次日仍然访问过的用户ID进行匹配,筛选出次日留存的用户。最后,通过计算次日留存用户数占当天访问用户数的比例,得到次日留存率。 注意,代码中的"当前日期"和"次日日期"应替换为具体的日期,以便计算相应日期的次日留存率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值