留存率
定义:某一天新增用户在之后的第n天仍然登录的比例,称为第n日留存率
例如:20220101新增100人,
20220102这100人中登录了60人,次日留存率为60%
20220103这100人中登录了40人,第2日留存率为40%

计算次日留存率,第2日留存率
用户t_user表(用户id,用户名user_name,注册时间register_time)
用户登录t_user_login (自增id,用户名uid,登录时间login_time)

法一:多表连接

#先计算20220101的次日留存与第二日留存
select date(tu.register_time),100*count(distinct t1.uid)/count(distinct tu.id) rr1,
100*count(distinct t2.uid)/count(distinct tu.id) rr2
from t_user tu
left join t_user_login t1 on (t1.uid = tu.id and date(t1.login_time) = date(tu.register_time)+ interval '1' day)
left join t_user_login t2 on (t2.uid = tu.id and date(t2.login_time) = date(tu.register_time)+ interval '2' day)
where tu.register_time between '2022-01-01 00:00:00' and '2022-01-01 23:59:59'
#每一天的留存率(删掉where,加group by)
select date(tu.register_time),100*count(distinct t1.uid)/count(distinct tu.id) rr1,
100*count(distinct t2.uid)/count(distinct tu.id) rr2
from t_user tu
left join t_user_login t1 on (t1.uid = tu.id and date(t1.login_time) = date(tu.register_time)+ interval '1' day)
left join t_user_login t2 on (t2.uid = tu.id and date(t2.login_time) = date(tu.register_time)+ interval '2' day)
group by date(tu.register_time)

法二:窗口函数
join多次,效率太低,用窗口函数进行优化

from t_user tu
left join t_user_login t1 on (t1.uid = tu.id and date(t1.login_time) = date(tu.register_time)+ interval '1' day)
left join t_user_login t2 on (t2.uid = tu.id and date(t2.login_time) = date(tu.register_time)+ interval '2' day)#两次join可以优化为:
from t_user tu
left join t_user_login t1 on (t1.uid = tu.id and (date(t1.login_time) = date(tu.register_time)+ interval '1' day
or date(t2.login_time) = date(tu.register_time)+ interval '2' day)
)

最终代码

#两次dense_rank()是为了找注册人数,登录人数
with t1 as (
select tu.id,t1.uid,date(tu.register_time) reg_date,date(t1.login_time) log_date,
dense_rank()over(partition by date(tu.register_time) order by tu.id) daily_reg,
dense_rank()over(partition by date(tu.register_time),date(t1.login_time) order by tu.id) daily_loginfrom t_user tu
left join t_user_login t1 on (t1.uid = tu.id and (date(t1.login_time) = date(tu.register_time)+ interval '1' day
or date(t2.login_time) = date(tu.register_time)+ interval '2' day))
)t2 as (
select reg_date,login_date,max(daily_reg),max(daily_login)
from t1
group by reg_date,login_date
)
select reg_date,max(daily_reg),
100*max(case when login_date = reg_date +interval '1' day then daily_login end)/max(daily_reg) rr1
from t2
group by reg_date;

SQL经典面试题--留存率问题相关推荐

  1. SQL经典面试题及答案

    转载自:http://blog.csdn.net/hwq1987/article/details/6670300 SQL经典面试题及答案 2007年07月27日 星期五 上午 08:42 1.一道SQ ...

  2. 【笔试/面试】SQL 经典面试题

    基本概念 (1)any/all,构成 where 子句的条件判断,any:表示或(or)的概念,all:则表示与(and)的概念,这两个关键字的出现是为了语句的简化: (2)先分组再做聚合,逻辑上也应 ...

  3. Hive SQL经典面试题:统计连续登陆的三天及以上的用户

    Hive SQL经典面试题 最近发现一道大数据面试经常会问的SQL题目:统计连续登录的三天及以上的用户(或者类似的:连续3个月充值会员用户.连续N天购买商品的用户等),下面就来记录一下解题思路. 要求 ...

  4. sql经典面试题50题

    总结不甚清楚的有:10,19,20,22,24,25,28,41,42 --1.查询"01"课程比"02"课程成绩高的学生的信息及课程分数 --1.1.查询同时 ...

  5. 数据库SQL经典面试题详解

    SQL面试题不外乎增删改查,对于这种类型的题目,我的经验是先把每个表的关联关系搞清楚,它们之间是通过哪些字段关联的,可以在纸上画出关联图,再去编写SQL就不会那么头大了. 下面是四张表的关联关系图: ...

  6. SQL经典面试题(二)

    有3个表S,C,SC S(SNO,SNAME)代表(学号,姓名)  //主键:SNO    //多个人,多门课 3张表   ,SC 关系表 C(CNO,CNAME,CTEACHER)代表(课号,课名, ...

  7. oracle sql经典面试题,经典SQL面试题2

    题目: 一张名为workersalary的表,要求查询出全部信息,并且salary最高的三个人按升序排列在结果的最开头,其余的人按原有顺序排列.这个sql如何写? 解答: (1)题意理解 假如原先的表 ...

  8. 30道SQL经典笔试题及其答案解析

    前言 搭配该文章食用更佳:MySQL常用操作指令大全 欢迎在评论区对该文章进行勘误. 一.建表 create table Student(sid varchar(10),sname varchar(1 ...

  9. mysql面试题sql语句_数据库MySQL经典面试题之SQL语句

    数据库MySQL经典面试题之SQL语句 1.需要数据库表1.学生表 Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex ...

最新文章

  1. 大端模式字节序和位序以及操作
  2. SDWC2017游记
  3. Bootstrap进度条
  4. [JavaWeb基础] 025.JAVA把word转换成html
  5. 方案解析:纸张计数精准测量出200张纸?!第1名妥妥的
  6. java学习(154):文件复制
  7. Android Runnable与Handler和Thread的使用,Handler构造方法弱引用实现
  8. python画窗口_pyqt中图案如何画在子窗口上
  9. 网路防火墙iptables
  10. 0+到10+随机数+java_Java随机数总结
  11. Windows Qt设置环境变量
  12. 如何将Word转换成PDF的几种使用方法
  13. JSP报刊订阅管理系统
  14. 微信网页中点击图片放大
  15. board crt_【大强哥-k8s从入门到放弃02】Kubernetes1.17部署Dashboard2.0
  16. WSTMart开源商城
  17. 信息安全体系建设☞数据完整性检查--信息安全开源工具分享
  18. 速通~腾讯云学生gpu服务器安装TensorFlow
  19. 神经网络低比特量化——LSQ
  20. Python爬取豆瓣电影top250的电影信息

热门文章

  1. 怎么打开Win10系统的文件夹选项?
  2. javascript判断浏览器和终端类型,js如何区分手机、电脑终端和浏览器
  3. 第02章 c语言初探(c语言笔记)2.1 第一个 C 语言程序
  4. 微信公众号如何和Salesforce集成,然后后台给公众号的关注者推送模板消息?
  5. Robot Framework(三):RIDE工具简介
  6. 众多的.ts文件、.key文件、.m3u8文件,合并成一个完整的mp4格式的视频
  7. 文案自动修改软件-文案自动改写的免费软件下载
  8. 百度BML飞桨训练营(十)面部表情迁移PaddleGAN--蒙娜丽莎在微笑
  9. 从90年代JDM到现在CDM现在namuDM,来了
  10. pytorch安装GPU版本 (Cuda12.1)教程