拼多多面试题:如何找出连续出现N次的内容?
wptr33 2025-07-28 00:37 24 浏览
【拼多多面试题】
两只篮球队进行了激烈的比赛,比分交替上升。比赛结束后,你有一张两队分数的明细表:
该表记录了球队、球员号码、球员姓名、得分分数以及得分时间。现在球队要对比赛中表现突出的球员做出奖励。
问题:
请你写一个sql语句统计出,连续三次(及以上)为球队得分的球员名单
【解题步骤】
1.窗口函数
连续三次(及以上)为球队得分的球员名单,用大白话翻译这句话就是:找出【每个球队】里为该球队连续三次(及以上)得分的球员【姓名】。
涉及到“每个”要想到《猴子 从零学会SQL》里讲过的用分组或者窗口函数。
因为该问题是“连续问题”,也就是得分连续三次以上是指比赛按得分时间从前到后排序。所以要用窗口函数,先根据球队分组,再按得分时间排序。
例如,下图按球队分组后,再按照得分时间降序排序后,我们可以看出,A队中的A1球员,B队中的B3球员,其姓名均连续出现3次。
对应的窗口函数如下:
查询结果:
上述结果中,我们能用肉眼看出A1连续出现3次,但是如何用SQL语句得出所有连续出现3次的球员姓名呢?
2.找出连续出现3次的值
如果我们将第1列“球员姓名”向上错位1行到第2列,向上错位2行到第3列,那么原本第1列连续的3个值会到同一行中去。例如下图,第1列三个连续A1值,现在到了同一行。
经过这种变化以后,此时我们只需要一个where子句限制三列的值相等,就可以筛选出连续出现三次的球员姓名。
那么,如何用SQL实现上述错位两列的效果呢?
可以用窗口函数lag或者lead:
向上窗口函数lead:取出字段名所在的列,向上N行的数据,作为独立的列向下窗口函数lag:取出字段名所在的列,向下N行的数据,作为独立的列
窗口函数语法如下:
lag(字段名,N,默认值) over(partion by …order by …)
lead(字段名,N,默认值) over(partion by …order by …)
默认值是指,当向上N行或者向下N行值时,如果已经超出了表行和列的范围时,会将这个默认值作为函数的返回值,若没有指定默认值,则返回Null。
这么说还是太抽象,下面我们通过一个例子来看下就明白了。
下图是用向上窗口函数lead,得到球员姓名向上1行的列(第2列),因为A1向上1行超出了表行列的范围,所以这里对应的值就是默认值(不设置默认值就是null)。
对应的SQL语句:
下图是用向下窗口函数lag,得到球员姓名向下1行的列(第2列),
对应的SQL语句如下:
根据前面的分析,我们要得到球员姓名向上1行,和向上2行的值,也就是:
lead(球员姓名,1)
lead(球员姓名,2)
对应的SQL语句如下:
查询结果:
3.SQL运行顺序
完成上面工作,现在就可以使用where子句筛选出出三个值都相同的行,也就是球员姓名 = 姓名1 and 球员姓名 = 姓名2。
但是需要注意,根据我们之前讲过的SQL运行顺序,不能直接在上述步骤后加入where子句。因为根据SQL的运行顺序,会先运行from和where子句,再运行select子句。
因此姓名1和姓名2两列要最后运行select时才会出现,我们需要用子查询来解决,同时最后的球员姓名需要去重(disitinct)。
查询结果:
本案例中也可以用下窗口函数lag,也可以得到一样的结果,原理类似,你可以自己画个图实践完可以发我分享你的学习成果。
【本题考点】
1.考查SQL的运行顺序和子查询
2.什么问题可以用到窗口函数?
《猴子 从零学会SQL》里讲过以下业务场景要用到窗口函数:
1)经典topN问题
2)经典排名问题
3)在每个组里比较的问题
4)累计求和问题
5)移动平均问题
6)连续出现N次的问题
3.考查窗口函数lag、lead的用法
这两个函数一般用于计算差值,例如:
1)计算花费时间。例如:某数据是每个用户浏览网页的时间记录,将记录的时间错位之后,进行两列相减就可以得到每个用户浏览每个网页实际花费的时间。
2)计算与上次相比薪水涨幅。
【举一反三】
以后遇到这种连续出现N次的问题,可以用下面的万能模板来解决:
例题:
下面是学生的成绩表(表名score,列名:学号、成绩),使用SQL查找所有至少连续出现3次的成绩。
该题我们使用lag函数:
对应实现SQL如下:
查询结果:
最终答案:
查询结果:
推荐:如何从零学会sql?
相关推荐
- oracle数据导入导出_oracle数据导入导出工具
-
关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...
- 继续学习Python中的while true/break语句
-
上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...
- python continue和break的区别_python中break语句和continue语句的区别
-
python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...
- 简单学Python——关键字6——break和continue
-
Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
-
用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...
- Python 中 break 和 continue 傻傻分不清
-
大家好啊,我是大田。...
- python中的流程控制语句:continue、break 和 return使用方法
-
Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...
- L017:continue和break - 教程文案
-
continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...
- 作为前端开发者,你都经历过怎样的面试?
-
已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...
- 面试被问 const 是否不可变?这样回答才显功底
-
作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...
- 2023金九银十必看前端面试题!2w字精品!
-
导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...
- 前端面试总结_前端面试题整理
-
记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...
- 由浅入深,66条JavaScript面试知识点(七)
-
作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...
- 2024前端面试真题之—VUE篇_前端面试题vue2020及答案
-
添加图片注释,不超过140字(可选)...
- 今年最常见的前端面试题,你会做几道?
-
在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...
- 一周热门
- 最近发表
-
- oracle数据导入导出_oracle数据导入导出工具
- 继续学习Python中的while true/break语句
- python continue和break的区别_python中break语句和continue语句的区别
- 简单学Python——关键字6——break和continue
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
- Python 中 break 和 continue 傻傻分不清
- python中的流程控制语句:continue、break 和 return使用方法
- L017:continue和break - 教程文案
- 作为前端开发者,你都经历过怎样的面试?
- 面试被问 const 是否不可变?这样回答才显功底
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)