抽空刷了牛客网SQL实战72题,最后几道以牛客网为例的题目还挺有挑战性,在此记录

  • 统计时间段新用户次日留存率
  • 每日的次日留存率
  • 每日的新用户数
  • 每日新用户的次日留存
  • 求新登录用户次日留存

表login第1行表示id为2的用户在2020-10-12使用了客户端id为1的设备第一次新登录了牛客网。需写出一个sql语句查询新登录用户次日成功的留存率,即第1天登陆之后,第2天再次登陆的概率,保存小数点后面3位(3位之后的四舍五入),例子查询结果如下:

(sqlite里查找某一天的后一天的用法是:date(yyyy-mm-dd, '+1 day'),四舍五入的函数为round,sqlite 1/2得到的不是0.5,得到的是0,只有1*1.0/2才会得到0.5)

--Step1:筛选统计期内,用户首次登录的信息(user_id以及date)
select user_id,min(date) as date from login
group by user_id--Step2:步骤一得到的表a和login表连接,计算出在登录后的第二天又登录的用户数
----------- 满足首次登录日期+1day=第二天登录日期
----------- 如果不满足,b表里对应的数据为null
select count(distinct b.user_id) from
(select user_id,min(date) as date from login
group by user_id) a
left join login b
on a.user_id=b.user_id and  b.date=date(a.date,'+1 day')--Step3:计算次日留存 次日登录用户数/登录用户数
select round(count(distinct b.user_id )*1.0/count(distinct a.user_id),3) as p
from
(select user_id,min(date) as date from login
group by user_id)as a
left join login b
on b.user_id=a.user_id
and b.date=date(a.date,'+1 day')

  • 查询每个日期登录新用户数

查询每个日期登录新用户个数,并且查询结果按照日期升序排序,上面的例子查询结果如下:(输出0,可以用sqlite的ifnull函数尝试实现,select ifnull(null,1)的输出是1)

--Step1:筛选出所有日期,并升序排列
select date from  login
group by date
order by date--Step2:筛选出每个用户首次登录的时间
select user_id,min(date) as date from login
group by user_id--Step3:将两张表连接
select * from
(select date from  login
GROUP BY date
order by date) a
left join
(select user_id,min(date) as date from login
group by user_id) b
on a.date=b.date--按照a.date分组,求出每组的人数
select a.date,count(b.user_id) as new from
(select date from  login
GROUP BY date
order by date) a
left join
(select user_id,min(date) as date from login
group by user_id) b
on a.date=b.date
group by a.date

思路示意图
  • 查询每个日期新用户的次日留存率

结果保留小数点后面3位数(3位之后的四舍五入),并且查询结果按照日期升序排序

--step1:筛选出每日新登录用户的user_id
SELECT a.date,b.user_id as 登陆新用户 from
(SELECT date from login
group by date
order by date) a
left join
(SELECT user_id,min(date) as date from login
group by user_id) b
on a.date=b.date--step2:在每日新登录用户信息后追加一列第二天仍继续登录的user_id
--------条件满足 首次登录日期+1 day=第二天登录日期
left join login c
on DATE_ADD(b.date,INTERVAL 1 day)=c.date
group by a.date
order by a.date--step3:计算次日留存率
--首日登录人数 count(distinct b.user_id) 次日登录数count(distinct c.user_id)
--将结果null替换成0,可以用case when 解决
SELECT a.date ,
case when count(b.user_id)=0 then 0.000
else round(count(DISTINCT c.user_id)*1.0/count(DISTINCT b.user_id),3)
end as p
from
(SELECT date from login
group by date) a
left join
(SELECT user_id,min(date) as date from login
group by user_id) b
on a.date=b.date
left join login c
on date(b.date,'+1 day')=c.date
group by a.date
order by a.date
;

  • 统计刷题用户信息

统计每个用户查询刷题信息,包括: 用户的名字,以及用户用的设备名字,以及截止到某天,累计总共通过了多少题。查询结果先按照日期升序排序,再按照姓名升序排序,有登录却没有刷题的那一天的数据不需要输出(不存在没有登录却刷题的情况,但是存在登录了没刷题的情况,不会存在刷题表里面,有提交代码没有通过的情况,但是会记录在刷题表里,只不过通过数目是0)

就是考察表连接,同时注意累计求和
SELECT
c.name as u_n,d.name as c_n,b.date as date,
sum(number) over (partition by b.user_id order by b.date)
FROM
passing_number as b
left join user as c on b.user_id = c.id
left join login as a on b.user_id = a.user_id
and b.date = a.date
left join client as d on a.client_id = d.id
order by
b.date,c.name

题目里的数据链接 提取码: 8jp8

sql里查询一个组和组的用户数怎么查?_【牛客网SQL刷题】留存率怎么算?相关推荐

  1. 牛客网数据开发题库_牛客网SQL题库NO.32~40

    不要问为什么没有31题,大概被牛客吞掉了吧,哈哈哈哈 SQL 32[简单] 将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分 CREA ...

  2. 牛客网SQL题目解析(答案+解析+理解)

    本文记录了牛客网sql全部题目的答案与难题解析,部分题目包含多种解法,并且涵盖了开窗函数等各种语法点的理解 标题中高亮的题目,是易错题 牛客网刷题链接:牛客网sql在线练习 本文所有语句使用mysql ...

  3. 牛客网SQL实战二刷 | Day10

    「牛客网SQL实战二刷」是个系列学习笔记博文,今天解析7道SQL题目- 第55 - 61题. 每篇笔记的格式大致为,三大板块: 大纲 题目(题目描述.思路.代码.相关参考资料/答疑) 回顾 ❤️「往期 ...

  4. 牛客网-SQL题库笔记

    牛客网-SQL题库笔记 01.最晚入职员工的所有信息 02.查找入职员工时间排名倒数第三的员工所有信息 03.查找各个部门当前领导当前薪水详情以及其对应部门编号 04.查找所有已经分配部门的员工的la ...

  5. 牛客网SQL实战二刷 | Day2

    「牛客网SQL实战二刷」是个系列学习笔记博文,每天解析6道SQL题目- 今天是第7-12 题!该系列的其他博文,可在「我的博客」 中查看- 每篇笔记的格式大致为,三大板块: 大纲 题目(题目描述.思路 ...

  6. 牛客网SQL刷题笔记(MySQL)

    牛客网SQL刷题笔记(MySQL) 此博客集合LeetCode.牛客网常见的题型及其解法,侵删 目录 牛客网SQL刷题笔记(MySQL) 类型1:查找排名第几的数据 SQL2 查找入职员工时间排名倒数 ...

  7. 牛客网数据开发题库_练习SQL利器,牛客网SQL实战题库

    牛客网SQL实战网址:https://www.nowcoder.com/ta/sql 持续更新--记录自己在牛客网SQL的做题过程 更新进度:61题,2019-4-3,更完了 1.查找最晚入职员工的所 ...

  8. 牛客网SQL 进阶篇刷题

    牛客网SQL 进阶篇刷题(1-19) 用户1001在2021年9月1日晚上10点11分12秒开始作答试卷9001,并在50分钟后提交,得了90分: 用户1002在2021年9月4日上午7点1分2秒开始 ...

  9. 牛客网sql练习题解(22-32)

    文章目录 简介 NO.22 NO.23 NO.24 NO.25 NO.26 NO.27 NO.28 NO.29 NO.30 NO.31 NO.32 简介 往期文章: 牛客网sql练习题解 (1-11) ...

最新文章

  1. PostgreSQL 异步IO实测
  2. 开始计算机USB存储功能,USB存储设备禁用怎么设置
  3. [转贴]玩你没商量:ADSL速率数字游戏解密
  4. VisualStudio 的 Spy++ —— 窗口、消息 的 查看分析利器
  5. MySQL:MySQL InnoDB引擎
  6. svn拒绝访问是什么原因_为什么Windows无法访问U盘|电脑U盘被拒绝访问
  7. 中标麒麟(linux)下Qt调用python数据转换
  8. Git使用疑难问题分析
  9. SPSS和excel数据分析之平均值和标准误差对比图
  10. 设计模式-12-命令模式
  11. android三分钟快速集成手势密码功能
  12. 大数据第一季--java基础(day22)-徐培成-专题视频课程
  13. 灵媒阅读开始自学通灵
  14. 用 HTML 做一个表单模板
  15. python easyOCR爬取微信的运动步数排名
  16. 用python实现双人五子棋(终端版)
  17. 计算机无法连接蓝牙键盘,Windows10下蓝牙键盘连接后使用不了如何解决
  18. 基于EasyExcel锁定指定列导出数据到excel
  19. nagios利用fetion发送报警
  20. [附源码]java毕业设计代驾服务系统

热门文章

  1. 如何捕获window.print点击打印或取消_原来1:1的CAD图纸要这样打印!学了这么久才知道...
  2. java中获取特定时间段_获取某一时间段特定星期几的所有日期(Java实现)
  3. android frida 检测_frida测试方法整理
  4. STM32 基础系列教程 33 - Lwip_tcp_client
  5. DFTug - Getting Started(上篇)
  6. 【arduino】继续蜂鸣器音乐播放,arduinoIDE里调用音乐播放库
  7. Summation Order
  8. Java交换两个Integer-一道无聊的题的思考
  9. Maven和Spring mvc下的页面的跳转与取值
  10. Citrix Port(常用端口)