SQL面试题——连续出现次数

SQL面试题——连续出现次数

其实前面关于连续问题,我们遇到过,就是最大连续登陆天数,或者是连续登陆天数的计算,可以参考我们之前的文章

SQL面试题——最大连续登陆问题

最大连续登陆问题

最大连续登陆问题的难点在于如何判断连续,其实实现原理很简单,我们首先让每个用户每一天只有一条数据,然后按照用户分区,按照时间做row_number() 排序。

例如下面的日期是某个用户的登陆日期,编号就是row_number() 返回的排序值

日期编号差值(n 天前)
2021-06-1012021-06-09
2021-06-1122021-06-09
2021-06-1232021-06-09
2021-06-1442021-06-10
2021-06-1552021-06-10

为了方便我在上面举了一个例子,假设一个用户在2021-06-10 到2021-06-12 连续登陆了3天,那么它们的差值都是2021-06-09号,但是在2021-06-13 号断了一天,然后又在2021-06-14到2021-06-15连续登陆了2天,它们的差值都是2021-06-10

也就是说连续登陆的天数就等于不同差值的个数

  1. 用户在2021-06-10号开始连续登陆了3天,它们的日期差是2021-06-09
  2. 用户在2021-06-14号开始连续登陆了2天,它们的日期差是2021-06-10

上面就是我们做最大连续登陆问题的关键

  1. 去重排序,每个用户每天只有一条数据
  2. 计算日期差值,连续登陆的天数就等于不同差值的个数
  3. 最大连续登陆,就是取个数最多的那个日期差值的个数

连续得分问题背景

这个问题的背景是这样的,勇士和湖人的西部半决赛正在进行中,有这样一张表basketball_score记录了每个球员的得分情况,我们的需求是找出连续4次(及以上)为球队得分的球员

这里的需求描述为球队肯定是指的是球队内连续4次(及以上)为球队得分的球员,也就是说在一个球队内连续4次以上得分的球员

+----+------+-----------+-----+-------------------+
|team|number|player_name|score|     get_score_time|
+----+------+-----------+-----+-------------------+
|勇士|    30|       库里|    3|2023-05-11 11:01:14|
|勇士|    30|       库里|    2|2023-05-11 11:02:17|
|湖人|    23|     詹姆斯|    1|2023-05-11 11:06:14|
|勇士|    30|       库里|    3|2023-05-11 11:07:12|
|湖人|    11|     戴维斯|    1|2023-05-11 11:08:12|
|勇士|    30|       库里|    3|2023-05-11 11:08:45|
|勇士|    11|     汤普森|    3|2023-05-11 11:09:11|
|勇士|    22|     维金斯|    3|2023-05-11 11:09:45|
|湖人|     1|     拉塞尔|    1|2023-05-11 11:10:27|
|湖人|    23|     詹姆斯|    1|2023-05-11 11:11:12|
|湖人|    23|     詹姆斯|    1|2023-05-11 11:14:12|
+----+------+-----------+-----+-------------------+

这是一道来自知乎帖子的问题,这里我们也看一些博主的解题思路

  1. 首先肯定是需要按球队分组
  2. 我们很容易能想到,如果按照得分时间排序后,能将得分球员的名字也组成单独的列,如果一行数据中,4列的球员名字都相同,该球员就是连续4次为球队得分的球员
  3. 根据这个思路,我们用偏移窗口函数lead(),分别取后一行,2行,3行的球员名字值,分别组成单独的列

感觉不是很好理解的话,看一下代码就立马懂了

  select team,player_name,lead(player_name,1)over(partition by team order by get_score_time) as player_name1,lead(player_name,2)over(partition by team order by get_score_time) as player_name2,lead(player_name,3)over(partition by team order by get_score_time) as player_name3from basketball_score

image-20241111100048167

就是player_name和player_name1,player_name2,player_name3 都相等的就是连续4次得分的球员,完整代码如下

select distinct team,player_name-- distinct语法规定对单字段、多字段去重,必须放在第一个查询字段前-- 如果对表中多列字段进行去重,去重的过程就是将多字段作为整体去重
from 
(select team,player_name,lead(player_name,1)over(partition by team order by get_score_time) as player_name1,lead(player_name,2)over(partition by team order by get_score_time) as player_name2,lead(player_name,3)over(partition by team order by get_score_time) as player_name3from basketball_score
) as t1
where t1.player_name=t1.player_name1
and t1.player_name=t1.player_name2
and t1.player_name=t1.player_name3

能不能解决这个问题呢,能,优雅不,不优雅,简单不,简单

问题出在哪里了,就只这里只计算了连续得分4次的,没有计算出4次以上的,如果想计算连续10次得分呢,需要增加9列吗?

连续得分问题解决思路

这个和连续登陆的问题不一样的地方,就是我们做不出来日期差值这样的一个判断连续的标志。所以我们需要构造这样的一个的一个列去判断连续,只要这个值相同就是连续,相同值的个数就是连续的次数,这和连续登陆问题的思路一样。

虽然我们不知道怎么利用球员和排序值构造出来这样一个列或者标志,但是我们知道一定会用到这个排序值的,最大连续登陆也用到了

selectteam,player_name,row_number() over(partition by team order by get_score_time) as rnfrombasketball_score

image-20241111101432184

其实观察这个数据我们发现,我们应该给四个连续的库里一个相同的值,也就是说我们给连续的值的标志是这个连续序列的第一个序号,可以参考詹姆斯的,当不连续的时候就给对应单独的

image-20241111101626182

如果能做到这样,就相当于我们构造出来了这个判断连续的列。现在的问题是我们怎么实现这个,其实我们可以这样,再构造一列获取上一次得分的球员,我们用库里这里举例子,我们会得到null,库里,库里,库里,库里 这样的一个序列,我们看一下数据

selectteam,get_score_time,player_name,lag(player_name,1)over(partition by team order by get_score_time) as lag_player_name,row_number() over(partition by team order by get_score_time) as rn
frombasketball_score

image-20241111102150599

这个时候我们可以让player_name和lag_player_name 相等的用null 填充,就是这次和上一次得分的是同一个人的

image-20241111102318376

selectteam,get_score_time,player_name,lag(player_name,1)over(partition by team order by get_score_time) as lag_player_name,if(player_name=lag_player_name,null,row_number() over(partition by team order by get_score_time) ) as new_rn    ,row_number() over(partition by team order by get_score_time) as rn
frombasketball_score

image-20241111102651458

可以观察我们构造出来的new_rn,这下我们只要用前面一个不是null 的new_rn 去填充是null 的,即可构造出来这样的一个标志列

selectteam,get_score_time,player_name,last(new_rn,true) over(partition by team order by get_score_time) as new_rn,rn
from (selectteam,get_score_time,player_name,lag(player_name,1)over(partition by team order by get_score_time) as lag_player_name,if(player_name=lag_player_name,null,row_number() over(partition by team order by get_score_time) ) as new_rn    ,row_number() over(partition by team order by get_score_time) as rnfrombasketball_score)

image-20241111103522281

到这里我们的目标列就构造出来了,接下来就来实现业务需求,这下和连续登陆一样了

selectteam,new_rn,max(player_name) as player_name-- 首次得分时间,min(get_score_time) as first_get_score_time-- 连续得分次数,count(1) as score_times
from(
selectteam,get_score_time,player_name,last(new_rn,true) over(partition by team order by get_score_time) as new_rn,rn
from (selectteam,get_score_time,player_name,lag(player_name,1)over(partition by team order by get_score_time) as lag_player_name,if(player_name=lag_player_name,null,row_number() over(partition by team order by get_score_time) ) as new_rn    ,row_number() over(partition by team order by get_score_time) as rnfrombasketball_score)
)
group byteam,new_rn
havingscore_times>=4

image-20241111104042785

总结

连续问题不论是连续登陆还是连续出现,我们的核心逻辑是构造判断连续的列,而这个列的构造依赖的是根据时间的排序值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/11578.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【LLM】3:从零开始训练大语言模型(预训练、微调、RLHF)

一、 大语言模型的训练过程 预训练阶段:PT(Pre training)。使用公开数据经过预训练得到预训练模型,预训练模型具备语言的初步理解;训练周期比较长;微调阶段1:SFT(指令微调/有监督微调…

腾讯云双11优惠大揭秘:省钱攻略不容错过!

文章目录 1 云服务来袭2 新手大礼包3 轻量应用服务器来袭4 腾讯云福利来袭5 福利代金券来袭 1 云服务来袭 云服务器能够灵活地提供计算和存储资源,帮助用户高效地应对信息技术需求,并保障数据的安全性。各大云服务商也因此纷纷推出多样化的优惠活动&…

皮卡超级壁纸 1.4.1 | 解锁会员版的全景壁纸、动态壁纸和超级壁纸

皮卡超级壁纸是一款提供海量壁纸的应用,不仅包含静态的精美壁纸,还提供了独特的超级壁纸。这些超级壁纸不仅仅是动态效果,还能自动匹配用户的手机UI,提供更加个性化的体验。解锁会员版后,用户可以享受更多高级功能和壁…

“绽放艺术风采、激发强国力量” 海南省第十一届中小学生艺术展演活动圆满开展

2024年11月1日,由省教育厅主办、琼台师范学院承办的海南省第十一届中小学生艺术展演省级展演活动在海口正式拉开帷幕。来自全省各市县、省属学校等共计4000余名师生参加本届中小学生艺术展演现场展演活动。 本届展演活动以“绽放艺术风采、激发强国力量”为主题&…

如何挑选靠谱的IP代理池?

嘿,寻觅一个靠谱的IP代理池就好比找到一双合脚的跑鞋,舒适性和耐用性缺一不可。IP代理池同样要支撑您在网络世界中“跑”得更快更远。所以,别急,我们来看看有哪些小妙招,教您挑选出最合适的IP代理池吧! 看…

2024/11/10周报

文章目录 摘要GCNCNNGA混合模型预测进水水质代码运行结果 文献阅读题目研究背景与意义研究方法数据采集与预处理GCN–CNNGA混合深度学习框架的构建 模型优化与实验邻接矩阵的构建与效果分析模型预测效果对比多步预测性能 模型优势与应用前景精度提升与处理效率运营决策的优化支…

公司内部最好用的开源导航网站(EasyNav)

公司导航门户 一个现代化的企业内部导航门户系统,用于集中管理和展示公司各类系统和资源的链接。 项目地址:https://github.com/starslink/EasyNav体验地址:www.easynav.icu/ 功能特点 🔐 用户认证与授权邮箱注册与验证 JWT t…

pulsar源码--3-官方文档杂技

消息队列中间件会保存消息,直到收到消费者消费成功并确认,在此之后消息便可以删除,不过什么时候删除,由中间件自己决定 ack消息会一直储存,直到现有的所有订阅都确认了这条消息,在此之后如果要继续保存则需…

为什么一些工业厂房的配电箱和供电线路要安装ALP?

1、什么是ALP? ALP 低压线路保护装置是一种智能型电气保护设备,适用于额定电压至 AC660V、额定电流至 AC400A、额定频率为 50/60Hz 的低压系统。集保护、测量、控制、总线通讯为一体,是低压馈线终端的智能化综合装置。 2、功能特点 ①能够…

如何让 AI 更懂你:提示词的秘密

目录 前言常见概念大语言模型(Large Language Model)大模型输入常见参数提示词工程的限制 战略思想效果评测复杂任务拆解提示词结构化加示例加要求加维度 提示词框架 前言 小册推荐:https://juejin.cn/book/7399064580883742774 评估响应内…

特征值分解原理和实战

特征值分解(Eigenvalue Decomposition)是线性代数中的一种重要技术,用于分析矩阵的内在属性。这种分解方法主要适用于方阵(即行数和列数相等的矩阵),用于将矩阵分解为其特征向量和特征值。 基本原理 假设 …

99人!关于第十八届中国青年科技奖拟表彰对象的公示!

本期精选SCI&EI ●IEEE 1区TOP 计算机类(含CCF); ●EI快刊:最快1周录用! 知网(CNKI)、谷歌学术期刊 ●7天录用-检索(100%录用),1周上线; 免费稿件评估 免费匹配…

cherno引擎课 -

感谢b站星云图形的翻译:【双语】【最佳游戏引擎教程实战】【入门】(1):Introducing the GAME ENGINE series!_哔哩哔哩_bilibili Introducing the GAMEENGINE series 希望:它是一个制作(互动)3D实时渲染应用程序的引…

【自然资源】吉林一号卫星有关知识,你要了解

吉林一号卫星有关知识,你要了解 吉林一号商业卫星是中国第一套自主研发的商用遥感卫星星座,由长光卫星技术有限公司研制。 “吉林一号”商业卫星组星包括1颗光学遥感卫星、2颗视频卫星和1颗技术验证卫星,工作轨道均为高约650公里的太阳同步轨…

博图与Factory I/O结合实现运料小车自动往返四次控制

一、示例要求 按照上图所示完成运料小车的往返控制,由于对虚拟工厂中零件应用不熟悉,所以料斗门和小车底门都用M0.x代替完成;只对传送带有了解,因此此处借助传送带使得纸箱达到往返运动。 二、I/O分配表 类别元件I/O端口编号备注…

扩散模型和重新照明的未来

重新照明(relighting)是在给定输入场景的情况下,在指定的目标照明条件下渲染场景的任务。这是计算机视觉和图形学中的关键任务。然而,这是一个不适定问题,因为场景中物体的外观是由光源、几何形状和表面材料属性等因素…

想学习海量数据的管理方法?听这节课就够了

在大模型时代,由于模型规模的升级,需要处理的数据量也大幅增加,因此对数据管理提出了更高的要求。 首先,分布式存储系统对于企业来说至关重要,将数据分散存储在多个节点上,可以提高数据的访问速度和处理能…

Works With线上开发者大会将提供物联网行业深入的专业知识和技能

Silicon Labs2024年Works With线上开发者大会定于11月20日至21日举行,将汇集全球各地的物联网开发人员、设备制造商、无线技术专家、工程师和商业领袖,观众可免费注册参加。同时,为了方便中文观众,所有在线视频均配有中文字幕。 芯…

2024 年(第 7 届)“泰迪杯”数据分析技能赛B 题 特殊医学用途配方食品数据分析 完整代码 结果 可视化分享

一、背景特殊医学用途配方食品简称特医食品,是指为满足进食受限、消化吸收障碍、代谢素乱或者特定疾病状态人群对营养素或者膳食的特殊需要,专门加工配置而成的配方食品,包括0月龄至12月龄的特殊医学用途婴儿配方食品和适用于1岁以上的特殊医…

【日记】总感觉搞这些才回到了自己的老本行……(1179 字)

正文 前两天忘记写了几件事。 一是,周五晚上打开自己的博客,准备翻自己的笔记,然后…… 我发现,博客的子列表打不开了。我知道,完蛋了。Mdbook 它又双叒叕更新了。这次不知道又把 index.hbs 哪里给改了。 反正&#xf…