数据分析/数据科学常见SQL题目:连续登录用户、留存率、最大观看人数
文章目录
- 1. SQL的执行顺序是什么?on和join谁先执行,为什么?on和where的区别?
- 2. 已知表user,字段id, date,求新用户的次日留存率
- 3. 已知表user,字段id,date,求每个日期新用户的次日留存率
- 4. 已知表a,字段id,log_date,求连续登录天数大于等于2的用户id
- 5. 已知表table,字段id,date,求连续三天或三天以上未登录的用户id
- 6. 订单表orders,字段有order_id,user_id,date。求22年1月每个用户单天订单最高次数和每个用户单天订单最高次数的日期。
- 7. 已知:商品上下架时间表log,商品id,上下架类型type(online:上架,offline:下架),时间log_time,输出每个商品id,上架时间online_time,下架时间offline_time。
- 8. 已知用户行为日志表tb_user_log,uid用户id,artical_id文章id,in_time观看开始时间,out_time观看结束时间。统计每篇文章同一时刻最大在看人数,如果同一时刻有进入也有离开时,先记录用户数增加再记录减少。结果按最大人数降序。
- 9. 有一张销量信息表table1,字段有类目cate,店铺id,销售额sales。求出每个类目销售额排名前40%的店铺信息。(输出字段cate,id,sales)
1. SQL的执行顺序是什么?on和join谁先执行,为什么?on和where的区别?
- 执行顺序:
from→on→join→where→group by→having→select→distinct→order by→limit
为什么on
在join
前面执行?因为要先经过筛选,才能通过连接把外部行加进来。
on
和where
的区别:on
筛选之后,可以通过外连接把移除的行再次添加进来,而where
是最终过滤的作用。
举个例子 有一个学生表:班级、姓名;一个成绩表:姓名、成绩。我们需要返回X
班的所有学生的成绩,但是班上有人缺考,也就是成绩表里没有姓名,我们先用on
得到的就是有考试成绩的名字,通过外连接,我们就可以得到全班人的名字以及成绩。
2. 已知表user,字段id, date,求新用户的次日留存率
select a.date, count(distinct b.id)/count(distinct a.id) rate
from (select id,min(date) date from user group by id) a #求出用户的第一次登录时间
left join user b on a.id=b.id
and datediff(b.date,a.date)=1
group by a.date
解析:首先需要找到每一个新用户的登录时间,与第二天进行对比,distinct
是为了排除用户同一天多次登录的情况。(本题未考虑新增用户为0
的情况,实际需不需要考虑由具体情况定)
3. 已知表user,字段id,date,求每个日期新用户的次日留存率
select c.date,ifnull(d.rate,0) rate from
(select distinct(date) date from user) c
left join
(select a.date,count(distinct b.id)/count(distinct a.id) rate
from (select id,min(date) date from user group by id) a
# 求出用户的第一次登录时间
left join user b on a.id=b.id and datediff(b.date,a.date)=1
group by a.date) d
on c.date=d.date
d表内容和上一题一样,但我们需要考虑某天新增用户为0的情况,并输出新增用户的次日留存率0以及日期。通过c表进行左连接之后,日期为连接条件,那么我们就获得了每个日期以及对应的新用户次日留存率。因为d表中不含新增用户为0的留存率情况,因此左连接之后,这种情况就会变成null
值,所以通过ifnull
函数转化成0,这样就输出了每个日期新用户的次日留存率情况了。
4. 已知表a,字段id,log_date,求连续登录天数大于等于2的用户id
SELECT distinct id
FROM (select *,dense_rank() over (PARTITION by id ORDER BY log_date)
dk from a) t
GROUP BY id,DATE_SUB(log_date,INTERVAL dk day)
HAVING count(DISTINCT(log_date))>=2
解析:首先需要给用户的登录日期排序,只能用dense_rank
是因为用户同一天可能会登录多次。如果一个用户连续登录或者同一天多次登录,那么他的登录日期与序号的差值是相同的,所以可以根据id
,差值分组,便可以求得用户的连续登录和同一天多次登录的累计天数。 having
里面的distinct
是为了排除用户同一天多次登录的情况,select
里面的distinct
是为了排除一个用户多次连续登录,比如:连续登录两天,第三天未登录,接着又连续登录两天。
5. 已知表table,字段id,date,求连续三天或三天以上未登录的用户id
select distinct id
from (select *,lag(date) over(partition by id order by date) date1 from table)a
where datediff(date,date1)>=4
lag
函数是为了获得用户上一次登录的时间,利用where
与本次登录时间进行比较。如果一个用户要连续三天没登录,因此他下一次登录就应该在第四天,所以是大于等于4。
6. 订单表orders,字段有order_id,user_id,date。求22年1月每个用户单天订单最高次数和每个用户单天订单最高次数的日期。
select user_id,date,cnt
from
(select user_id,date,cnt,rank() over(partition by user_id order by cnt desc) rk
from (select user_id,date,count(order_id) cnt from orders where date_format(date,'%Y%m')=202201 group by user_id,date)a
)b
where rk=1
解析:每个用户每天可能下单多次,因此需要先统计每个用户每天的订单量也就是a
表。然后利用窗口函数对用户id
分组对订单量倒序排序,筛选出排名为1
的数据就可以了。如果题目不要求求出每个用户单天订单最高次数的日期,那么可以直接对a
表用户id
分组,使用max
函数再得出结果了。
7. 已知:商品上下架时间表log,商品id,上下架类型type(online:上架,offline:下架),时间log_time,输出每个商品id,上架时间online_time,下架时间offline_time。
select a.id,a.log_time online_time,b.log_time offline_time from (select id,log_time,row_number()over(partition by id order by log_time) rn1 from log where type='online')a
left join (select id,log_time,row_number()over(partition by id order by log_time) rn2 from log where type='offline')b
on a.id=b.id and a.rn1=b.rn2
解析:同一个商品有多个上下架时间,因此不能通过case when
进行行转列。首先需要对同一个商品所有的上下架时间进行排序,根据序号让每一个上架时间匹配对应的下架时间。用left join
是因为会存在商品有上架时间,没有下架时间这种情况。
8. 已知用户行为日志表tb_user_log,uid用户id,artical_id文章id,in_time观看开始时间,out_time观看结束时间。统计每篇文章同一时刻最大在看人数,如果同一时刻有进入也有离开时,先记录用户数增加再记录减少。结果按最大人数降序。
select artical_id,max(uv) max_uv from
(select artical_id,sum(num) over(partition by artical_id order by dt,num desc) uv from (select artical_id,in_time dt,1 num from tb_user_logunion all select artical_id,out_time dt,-1 num from tb_user_log) a
) b
group by artical_id
order by max_uv desc
首先需要想到的是,做这种类似某一时刻最大在线人数的题目,都可以转化成当用户开始观看时用户数+1
,当用户结束观看时用户数-1
,然后通过sum
窗口函数累计求和。如果能想到这一点,这题就很简单了。所以刚开始需要将用户观看开始、观看结束的时间表取出来,再合并变成表a
。通过sum
窗口函数对每个文章进行分组根据时间顺序排序、num
倒序排序累计求和变成表b
,用sum
函数是因为需要求出每个时刻的累计在线人数。num
倒序排序是因为同一时刻有进入也有离开时,先记录增加,再记录减少。最后对b
表通过文章id
分组,max
函数就可以求到最大在看人数了,结果按降序排序,加个order by max_uv desc
就行了。
9. 有一张销量信息表table1,字段有类目cate,店铺id,销售额sales。求出每个类目销售额排名前40%的店铺信息。(输出字段cate,id,sales)
select cate,id,sales from (
select cate,id,sales,row_number()
over(partition by cate order by sales desc) rn,
count(id) over(partition by cate) ct from table1
) a
where rn/ct<=0.4
解析:首先先对每个类目的销售额进行倒序排序,也就是row_number()
窗口函数。count(id) over(partition by cate)
是求出每个类目中的店铺个数,然后从a
表中查询设置where
条件前40%
就可以了。
相关文章:
数据分析/数据科学常见SQL题目:连续登录用户、留存率、最大观看人数
文章目录 1. SQL的执行顺序是什么?on和join谁先执行,为什么?on和where的区别?2. 已知表user,字段id, date,求新用户的次日留存率3. 已知表user,字段id,date,求每个日期新用户的次日留…...

【Conda】Windows安装conda/Anaconda环境
安装conda并配置powershell 访问该网址,下载安装即可: Anaconda下载 安装完成后,打开Anaconda,并访问Powershell Prompt 弹出Windows Terminal,并正常进入Conda 【非必须】如果不是通过Windows Terminal打开&#x…...

olmOCR:高效精准的 PDF 文本提取工具
在日常的工作和学习中,是否经常被 PDF 文本提取问题困扰?例如: 想从学术论文 PDF 中提取关键信息,却发现传统 OCR 工具识别不准确或文本格式混乱?需要快速提取商务合同 PDF 中的条款内容,却因工具不给力而…...

数字投屏叫号器-发射端python窗口定制
窗口 本系列前章介绍,叫号器的显示端,完成了视频音频的形成和传输的介绍。本章节开始定制小窗口。 最终实现,处于桌面最前端,发送指令,集合前篇即可完成: 处理本地text.txt更新,随之被rtsp采集…...

从零开始实现大语言模型(十四):高阶训练技巧
1. 前言 预训练大语言模型的流程与训练普通神经深度网络模型本质上并没有任何不同。可以使用深度学习实践中已经被证明非常有效的高阶训练技巧,优化大语言模型预训练流程,使大语言模型预训练效率更高,训练过程更稳定。 本文介绍深度学习领域…...

Spring-framework源码编译
版本统一(搭配其他版本会遇到不可知错误): 1)spring 5.2.X(5.5.26) 2)JDK8 3)Gradle:5.6.4 可以在gradle-wrapper.properties中修改 https\://services.gradle.org/distribution…...
分布式系统的核心挑战与解决方案
1、分布式系统的引入 在移动互联网、云计算和物联网的推动下,现代软件系统需要处理亿级用户请求、PB级数据存储和毫秒级响应需求。传统的单体架构受限于单机性能瓶颈和容灾能力,逐渐被分布式系统取代。例如,电商平台在“双十一”期间需应对每…...
fastjson漏洞
fastjson漏洞 fastjson工作原理攻击原理补充 例子 fastjson工作原理 fastjson的作用是将JAVA对象转换成对应的json表示形式,也可以反过来将json转化为对应的Java对象。fastjson使用AutoType功能进行反序列化,AutoType使用type标记字符的原始类型&#x…...

upload-labs详解(13-20)文件上传分析
目录 upload-labs-env upload-labs-env第十三关 文件包含漏洞 代码 测试 上传一个.jpg图片 上传一个.png文件 上传一个.gif图片 upload-labs-env第十四关 代码 思路 upload-labs-env第十五关 代码 思路 upload-labs-env第十六关 代码 思路 测试 上传gif格式…...

HTML第四节
一.复合选择器 1.后代选择器 注:1.后代选择器会选中后代所有的要选择的标签 2.儿子选择器 3.并集选择器 注:1.注意换行,同时选中多种标签 4.交集选择器 注:1.标签选择器放在最前面,例如放在类选择器的前面 2.两个选择…...

基于 LeNet 网络的 MNIST 数据集图像分类
1.LeNet的原始实验数据集MNIST 名称:MNIST手写数字数据集 数据类型:灰度图 (一通道) 图像大小:28*28 类别数:10类(数字0-9) 1.通过torchvision.datasets.MNIST下载并保存到本地…...

win11编译llama_cpp_python cuda128 RTX30/40/50版本
Geforce 50xx系显卡最低支持cuda128,llama_cpp_python官方源只有cpu版本,没有cuda版本,所以自己基于0.3.5版本源码编译一个RTX 30xx/40xx/50xx版本。 1. 前置条件 1. 访问https://developer.download.nvidia.cn/compute/cuda/12.8.0/local_…...
Spring Boot静态资源访问顺序
在 Spring Boot 中,static 和 public 目录都用于存放静态资源(如 HTML、CSS、JavaScript、图片等文件),但它们在使用上有一些细微的区别。以下是它们的详细对比: 1. 默认优先级 Spring Boot 会按照以下优先级加载静态…...

电脑总显示串口正在被占用处理方法
1.现象 在嵌入式开发过程中,有很多情况下要使用串口调试,其中485/422/232转usb串口是非常常见的做法。 根据协议,接口芯片不同,需要安装对应的驱动程序,比如ch340,cp2102,CDM212364等驱动。可…...
工具介绍《HACKBAR V2》
HackBar V2 是一款功能强大的浏览器渗透测试工具,主要用于测试 SQL 注入、XSS 漏洞、POST 传参等安全场景。以下是其核心功能、用法及实际案例操作的综合介绍: 一、核心功能与用法详解 1. 基础操作 Load URL 功能:将当前浏览器地址栏的 URL …...
Java算法语法学习 美丽子集的数目 - 力扣 Map接口
文章目录 题目解题思路题解统计数组中每个数字按模k分组的出现次数,并保持数值有序作用 **merge(x, 1, Integer::sum)**解释**检查键是否存在**:**合并现有值**: 示例在代码中的应用**计算余数**:**存储余数及其出现次数**: merge 的常见用法统计频率合并字符串合并…...

Vue项目通过内嵌iframe访问另一个vue页面,获取token适配后端鉴权(以内嵌若依项目举例)
1. 改造子Vue项目进行适配(ruoyi举例) (1) 在路由文件添加需要被外链的vue页面配置 // 若依项目的话是 router/index.js文件 {path: /contrast,component: () > import(/views/contrast/index),hidden: true },(2) 开放白名单 // 若依项目的话是 permission.js 文件 cons…...
梯度本质论:从黎曼流形到神经网络的拓扑寻优
一、微分几何框架下的梯度再诠释 在标准数学分析中,梯度被定义为标量场 f : R n → R f:\mathbb{R}^n→\mathbb{R} f:Rn→R的导数张量 ∇ f ( ∂ f ∂ x 1 , . . . , ∂ f ∂ x n ) \nabla f(\frac{\partial f}{\partial x_1},...,\frac{\partial f}{\partial x_n…...

计算机毕业设计SpringBoot+Vue.js网络海鲜市场系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

一文对比RAGFLOW和Open WebUI【使用场景参考】
一、RAGFLOW与Open WebUI RAGFLOW是一款基于深度文档理解构建的开源 RAG(Retrieval-Augmented Generation)引擎。RAGFlow 可以为各种规模的企业及个人提供一套精简的 RAG 工作流程,结合大语言模型(LLM)针对用户各类不…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...