用户留存率是什么?如何用sql求出次日留存率?
建表sql语句:
drop table if exists liucunlv;
create table liucunlv as select * from (
select 'a' as user_name, '2021-03-01'as logindateunion all
select 'a' as user_name, '2021-03-02'as logindateunion all
select 'a' as user_name, '2021-03-03'as logindateunion all
select 'a' as user_name, '2021-03-05'as logindateunion all
select 'b' as user_name, '2021-03-02'as logindateunion all
select 'b' as user_name, '2021-03-03'as logindateunion all
select 'c' as user_name, '2021-03-02'as logindateunion all
select 'c' as user_name, '2021-03-04'as logindateunion all
select 'c' as user_name, '2021-03-05'as logindateunion all
select 'c' as user_name, '2021-03-06'as logindateunion all
select 'c' as user_name, '2021-03-07'as logindateunion all
select 'd' as user_name, '2021-03-07'as logindate) t
SELECT * FROM liucunlv
一:现在要求出哪些用户才是次日留存的用户
SELECT user_name,MIN(logindate) AS newdate FROM liucunlv GROUP BY user_name
如果logindate和newdate相差一天,那么就让if_ciriliucun=1否则if_ciriliucun=0
SELECT t1.user_name,CASE WHEN DATEDIFF(logindate,newdate)=1 THEN 1 ELSE 0 END AS if_ciriliucun
FROM
(
SELECT user_name,MIN(logindate) AS newdate FROM liucunlv GROUP BY user_name
)t1
JOIN liucunlv t2 ON t1.user_name=t2.user_name
之后再做一个groupby user_name,就能选出是否是次日留存的用户了
SELECT t3.user_name,MAX(if_ciriliucun) FROM
(
SELECT t1.user_name,CASE WHEN DATEDIFF(logindate,newdate)=1 THEN 1 ELSE 0 END AS if_ciriliucun
FROM
(
SELECT user_name,MIN(logindate) AS newdate FROM liucunlv GROUP BY user_name
)t1
JOIN liucunlv t2 ON t1.user_name=t2.user_name)t3 GROUP BY t3.user_name
可以看到,a和b是次日留存的用户
二:求每日的次日留存率
留存率解释:
在互联网行业中,用户在某段时间内开始使用应用,经过一段时间后,仍然继续使用该应用的用户,被认作是留存用户。这部分用户占当时新增用户的比例即是留存率,会按照每隔1单位时间(例日、周、月)来进行统计。
SELECT t1.logindate AS 日期,COUNT(DISTINCT CASE WHEN DATEDIFF(t3.logindate,newdate) = 1 THEN t3.user_name ELSE NULL END) AS 次日留存用户数,COUNT(DISTINCT t2.user_name) AS 新增用户数,CONCAT(round(COUNT(DISTINCT CASE WHEN DATEDIFF(t3.logindate,newdate) = 1 THEN t3.user_name ELSE NULL END)*100/COUNT(DISTINCT t2.user_name),2),'%') AS 次日留存率
FROM(SELECT DISTINCT logindateFROM liucunlv) t1
LEFT JOIN(SELECT user_name,MIN(logindate) newdateFROM liucunlvGROUP BY user_name) t2 ON t2.newdate = t1.logindate
LEFT JOIN liucunlv t3 ON t2.user_name = t3.user_name
GROUP BY t1.logindate
求每日的次日留存率的整体代码如果读起来有困难,可以尝试接着往下读:
将求每日的次日留存率的整体代码拆解如下::
t1:
SELECT DISTINCT logindateFROM liucunlv
t2:
SELECT user_name,MIN(logindate) newdateFROM liucunlvGROUP BY user_name
t3:
将t1,t2,t3合起来得到一个表a
SELECT *
FROM(SELECT DISTINCT logindateFROM liucunlv) t1
LEFT JOIN(SELECT user_name,MIN(logindate) newdateFROM liucunlvGROUP BY user_name) t2 ON t2.newdate = t1.logindate
LEFT JOIN liucunlv t3 ON t2.user_name = t3.user_name
再将表a group by t1.logindate (表a的第一列),做一些聚合运算,便得到
SELECT t1.logindate AS 日期,COUNT(DISTINCT CASE WHEN DATEDIFF(t3.logindate,newdate) = 1 THEN t3.user_name ELSE NULL END) AS 次日留存用户数,COUNT(DISTINCT t2.user_name) AS 新增用户数,CONCAT(round(COUNT(DISTINCT CASE WHEN DATEDIFF(t3.logindate,newdate) = 1 THEN t3.user_name ELSE NULL END)*100/COUNT(DISTINCT t2.user_name),2),'%') AS 次日留存率
FROM(SELECT DISTINCT logindateFROM liucunlv) t1
LEFT JOIN(SELECT user_name,MIN(logindate) newdateFROM liucunlvGROUP BY user_name) t2 ON t2.newdate = t1.logindate
LEFT JOIN liucunlv t3 ON t2.user_name = t3.user_name
GROUP BY t1.logindate
得到我们想要的次日留存率:
引用:
https://blog.csdn.net/weixin_38617657/article/details/116697972
用户留存率是什么?如何用sql求出次日留存率?相关推荐
- 如何用sql求基金连涨、连跌天数
背景:某万恶的产品经理要求计算基金的最大连涨连跌天数,但SQL具有局限性,不擅长表达相对位置,特别是计算连续.虽然可以通过窗口函数,但如下所示,逻辑较为复杂,且不易于理解,因此有必要换一种思路来实现: ...
- 如何用sql求平均成绩
用sql求 平均成绩大于80的学生姓名
- SQL求出小于45岁的各个老师所带的大于12岁的学生人数
数据库中有3个表 teacher 表,student表,tea_stu关系表. teacher 表 teaID name age ...
- 如何用matlab求出覆冰图像像素点,输电线路覆冰图像的Canny算子改进算法研究
输电线路覆冰图像的Canny算子改进算法研究 摘 要: 每到冬季 关键词: 形态学滤波; Canny算子; 边缘检测; 覆冰检测; 微分算子 中图分类号:TM755 文献标志码:A文章编号:1006- ...
- 如何用SQL求众数和中位数
- matlab求曲线每点的斜率_如何用matlab求出图中各条直线的斜率
展开全部 1.瞬时斜率62616964757a686964616fe4b893e5b19e31333431373236:求导. 方法:d(k)=(u(k)-u(k-1))/T(k);d(0)=0; d ...
- 如何用函数求出身份证号码中的出生日期——CONCATENATE、MID函数的使用方法
CONCATENATE函数: 主要功能:可以将多个字符串合并成一个字符串. 格式参数说明:CONCATENATE(Text1, Text2,Text3,-) 使用例子:若"Text1&quo ...
- c语言如何用三目运算符求出三个数中最大的数?直接看图
#include<stdio.h> int main(void) { int a = 10,b = 23,c = 45; scanf("%d,%d,%d",&a ...
- 2021_lg_03.SQL实战:如何用sql计算用户留存问题
如何用sql计算用户留存问题 一.留存 1 .留存的含义: 留存:指基准日到APP的用户在之后的n日当天返回APP的人数: 留存率 = 基准日之后的n天当日返回的用户数 / 基准日的用户数 * 100 ...
最新文章
- PHP文件上传和文件操作案例
- Python 绘图库 Matplotlib
- YBTOJ洛谷P4331:数字序列(左偏树)
- 每日算法系列【LeetCode 289】生命游戏
- 学python需要c-为什么我建议每个开发人员都需要学 Python ?
- 手把手教你二维数组打印
- python修改表格居中_python修改表格居中_CSS样式更改——列表、表格和轮廓
- 瑞典皇家理工学院计算机科学世界排名,2017瑞典皇家理工学院世界排名
- java四大名著知乎_给四大名著重新取名……从知乎热帖看畅销书起名套路
- 时间都哪去了--电视连续剧《老牛家的战争》插曲【视频】
- JPA是什么?JPA怎么应用?为什么要用JPA
- 买笔记本电脑如何避坑之接口篇
- Layabox 实现画 刚体线
- Qt中国象棋之棋子的实现
- 网页设计至少要掌握哪些技能
- Android项目内简单集成微信和支付宝支付功能
- MySQL的嵌套查询
- VNC协议-认证过程
- 德国的Duisburger Modellfabrik公司把WorkNC用于精密工程和大型模具制造
- ROCK Pi 4B+ Ubuntu Server 安装图形桌面