前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >大数据 面试 SQL 040 计算次日留存率

大数据 面试 SQL 040 计算次日留存率

作者头像
数据仓库晨曦
发布2024-01-08 15:53:33
2010
发布2024-01-08 15:53:33
举报
文章被收录于专栏:数据仓库技术数据仓库技术

一、题目

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

代码语言:javascript
复制
+----------+-------------+
| 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  |
+----------+-------------+

二、分析

维度

评分

题目难度

⭐️⭐️⭐️⭐️

题目清晰度

⭐️⭐️⭐️⭐️⭐️

业务常见度

⭐️⭐️⭐️⭐️⭐️

三、SQL

指标定义:

次日留存用户:新增用户第二天登录(活跃)的用户;

次日留存率:t+1日留存用户数/t日新增用户;

1.根据登录日志,使用开窗函数计算出用户的最小登录时间作为新增日期first_day,然后计算当天日期和新增日期的时间差。

代码语言:javascript
复制
select
  user_id,
  login_date,
  min(login_date)over(partition by user_id order by login_date asc) as first_day,
  datediff(login_date,min(login_date)over(partition by user_id order by login_date asc)) as date_diff
from t_login_040

查询结果

2.我们根据first_day进行分组,date_diff=0的为当天新增用户,date_diff=1的为次日登录的用户

代码语言:javascript
复制
select
first_day,
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,
  min(login_date)over(partition by user_id order by login_date asc) as first_day,
  datediff(login_date,min(login_date)over(partition by user_id order by login_date asc)) as date_diff
from t_login_040
)t
group by first_day
order by first_day asc

查询结果

3.用次日留存数/新增用户数据即为留存率,因为新增可能为0,所以需要先判断。

代码语言:javascript
复制
select
first_day,
concat(if(count(case when  date_diff = 0 then user_id end) =0,0,count(case when date_diff =1 then user_id end) /count(case when  date_diff = 0 then user_id end))*100,'%') as next_act_per
from(
select
  user_id,
  login_date,
  min(login_date)over(partition by user_id order by login_date asc) as first_day,
  datediff(login_date,min(login_date)over(partition by user_id order by login_date asc)) as date_diff
from t_login_040
)t
group by first_day
order by first_day asc

查询结果

四、建表语句和数据插入

代码语言:javascript
复制
create table t_login_040
(
user_id string COMMENT '用户ID',
login_date string COMMENT '登录日期'
) COMMENT '用户登录记录表'
stored as orc
;

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');
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据仓库技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、题目
  • 二、分析
  • 三、SQL
  • 四、建表语句和数据插入
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档