建表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求出次日留存率?相关推荐

  1. 如何用sql求基金连涨、连跌天数

    背景:某万恶的产品经理要求计算基金的最大连涨连跌天数,但SQL具有局限性,不擅长表达相对位置,特别是计算连续.虽然可以通过窗口函数,但如下所示,逻辑较为复杂,且不易于理解,因此有必要换一种思路来实现: ...

  2. 如何用sql求平均成绩

    用sql求 平均成绩大于80的学生姓名

  3. SQL求出小于45岁的各个老师所带的大于12岁的学生人数

    数据库中有3个表 teacher 表,student表,tea_stu关系表.                   teacher 表 teaID name age                   ...

  4. 如何用matlab求出覆冰图像像素点,输电线路覆冰图像的Canny算子改进算法研究

    输电线路覆冰图像的Canny算子改进算法研究 摘 要: 每到冬季 关键词: 形态学滤波; Canny算子; 边缘检测; 覆冰检测; 微分算子 中图分类号:TM755 文献标志码:A文章编号:1006- ...

  5. 如何用SQL求众数和中位数

  6. matlab求曲线每点的斜率_如何用matlab求出图中各条直线的斜率

    展开全部 1.瞬时斜率62616964757a686964616fe4b893e5b19e31333431373236:求导. 方法:d(k)=(u(k)-u(k-1))/T(k);d(0)=0; d ...

  7. 如何用函数求出身份证号码中的出生日期——CONCATENATE、MID函数的使用方法

    CONCATENATE函数: 主要功能:可以将多个字符串合并成一个字符串. 格式参数说明:CONCATENATE(Text1, Text2,Text3,-) 使用例子:若"Text1&quo ...

  8. c语言如何用三目运算符求出三个数中最大的数?直接看图

    #include<stdio.h> int main(void) { int a = 10,b = 23,c = 45; scanf("%d,%d,%d",&a ...

  9. 2021_lg_03.SQL实战:如何用sql计算用户留存问题

    如何用sql计算用户留存问题 一.留存 1 .留存的含义: 留存:指基准日到APP的用户在之后的n日当天返回APP的人数: 留存率 = 基准日之后的n天当日返回的用户数 / 基准日的用户数 * 100 ...

最新文章

  1. PHP文件上传和文件操作案例
  2. Python 绘图库 Matplotlib
  3. YBTOJ洛谷P4331:数字序列(左偏树)
  4. 每日算法系列【LeetCode 289】生命游戏
  5. 学python需要c-为什么我建议每个开发人员都需要学 Python ?
  6. 手把手教你二维数组打印
  7. python修改表格居中_python修改表格居中_CSS样式更改——列表、表格和轮廓
  8. 瑞典皇家理工学院计算机科学世界排名,2017瑞典皇家理工学院世界排名
  9. java四大名著知乎_给四大名著重新取名……从知乎热帖看畅销书起名套路
  10. 时间都哪去了--电视连续剧《老牛家的战争》插曲【视频】
  11. JPA是什么?JPA怎么应用?为什么要用JPA
  12. 买笔记本电脑如何避坑之接口篇
  13. Layabox 实现画 刚体线
  14. Qt中国象棋之棋子的实现
  15. 网页设计至少要掌握哪些技能
  16. Android项目内简单集成微信和支付宝支付功能
  17. MySQL的嵌套查询
  18. VNC协议-认证过程
  19. 德国的Duisburger Modellfabrik公司把WorkNC用于精密工程和大型模具制造
  20. ROCK Pi 4B+ Ubuntu Server 安装图形桌面

热门文章

  1. vim 一些常用命令
  2. 《计算机网络》(第8版)第五章 运输层 知识点总结
  3. Apple Watch卡住在苹果标志界面,该怎么解决?
  4. 【Mac 教程系列第 16 篇】如何查看 Apple 产品的真伪
  5. New Era with AlphaGo
  6. css-标准盒子与怪异盒子
  7. 客户化软件时代的前夜 ZT
  8. 关于论文中bib文件的参考格式
  9. ST北生(600556)关于资产重组进展情况的公告
  10. 【转】小科普|FET、 MOSFET、 MESFET、 MODFET的区别