3道常见的SQL笔试题,你要不要来试试!
都说“金九银十”,马上十月份即将结束,相信还有相当多的小伙伴没找到合适的工作。在笔试过程中,总会出现那么一两道“有趣”的SQL题,来检测应聘者的一个逻辑思维,这对于初入职场的“小白”也是非常不友好。不用担心,本篇博客,博主整理了几道在面试中高频出现的“SQL”笔试题,助你在接下来的面试中一往无前,势如破竹!
文章目录
- 1、查询连续登陆3天以上的用户
- step1: 用户登录日期去重
- step2: 用row_number() over()函数计数
- step3:日期减去计数值得到结果
- step4:根据id和结果分组并计算count
- 2、统计每个用户的累计访问次数
- step1: 修改数据格式
- step2: 计算每人单月访问量
- step3: 按月累计计算访问量
- 完整SQL
- 3、分组TopN
- step1:查询每个店铺被每个用户访问次数
- step2:计算每个店铺被用户访问次数排名
- step3: 取每个店铺排名前3的数据
- 完整SQL
- 结语
1、查询连续登陆3天以上的用户
这是一道非常经典的问题,这里提供其中一种思路。
表信息如下图:
step1: 用户登录日期去重
因为一个用户同一天可能登录多次,所以我们首先需要用用户登录日期去重。
select DISTINCT date(date) as "日期",id from demo01;
查询结果:
step2: 用row_number() over()函数计数
有了第一步去重后的结果,我们可以对其进行开窗,以id分组,日期升序排序,获取到每个日期的排名。
SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY `日期`) AS cum
FROM (SELECT DISTINCT date(date) AS `日期`, idFROM demo01
) a;
查询结果:
相信看到这里,各位小伙伴已经看出其中的“玄机”了~为什么我们需要在这一步对时间进行一个排序呢?
可以发现,用row_number开窗之后的名次是连续的,那么如果日期也是连续的,它们的差值不就是一个固定的值了吗?
step3:日期减去计数值得到结果
因为菌哥这里演示用的是hql,所以这里获取日期差值使用了date_sub
函数。
SELECT *, date_sub(`日期`, cum) AS `结果`
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY `日期`) AS cumFROM (SELECT DISTINCT date(date) AS `日期`, idFROM demo01) a
) b;
查询结果:
step4:根据id和结果分组并计算count
最后一步,我们直接根据step3中获取到的差值,根据id和差值进行一个分组求count即可。如果是要求连续登录3天以上,我们直接判断 count 的个数大于等于3即可。
SELECT id, COUNT(*)
FROM (SELECT *, date_sub(`日期`, cum) AS `结果`FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY `日期`) AS cumFROM (SELECT DISTINCT date(date) AS `日期`, idFROM demo01) a) b
) c
GROUP BY id, `结果`
HAVING COUNT(*) >= 3;
运行结果:
答案已经出来了,id为1和3的用户至少连续登录了3天及以上,他们分别连续登录的时长为3天和4天。
2、统计每个用户的累计访问次数
这个同样也是经常在笔试中出现的题目,大家可以根据作者的思路回顾一下:
表信息如下图:
要求使用SQL统计出每个用户的累积访问次数,如下表所示:
用户id | 月份 | 小计 | 累积 |
---|---|---|---|
u01 | 2017-01 | 11 | 11 |
u01 | 2017-02 | 12 | 23 |
u02 | 2017-01 | 12 | 12 |
u03 | 2017-01 | 8 | 8 |
u04 | 2017-01 | 3 | 3 |
step1: 修改数据格式
从结果反推,需要查询实现按照 年-月 分组的数据,所以我们这一步先对原数据进行一个处理。
selectuserId,date_format(regexp_replace(visitDate,'/','-'),'yyyy-MM') mn,visitCount
fromaction;t1
处理结果:
step2: 计算每人单月访问量
为了让子查询看起来更加的美观,我们这里先用t1代替上一步的结果。通过这一步,我们就可以获取到每个用户,每个月的访问量。
selectuserId,mn,sum(visitCount) mn_count
fromt1
group by userId,mn;t2
查询的结果:
step3: 按月累计计算访问量
我们将第二步的结果用变量 t2 来表示。到这一步,我们用一个sum开窗函数,对userid进行分组,mn时间进行排序即可大功告成。
selectuserId,mn,mn_count,sum(mn_count) over(partition by userId order by mn) mn_all
from t2;
最终结果:
完整SQL
温馨提示:上述的步骤展示的都是不完整的SQL,每步使用变量代替前一步的SQL语句只是为了方便给大家展示,实际上运行的结果都是作者将完整的SQL放进去跑的哈~
selectuserId,mn,mn_count,sum(mn_count) over(partition by userId order by mn) mn_all
from
( selectuserId,mn,sum(visitCount) mn_countfrom(selectuserId,date_format(regexp_replace(visitDate,'/','-'),'yyyy-MM') mn,visitCountfromaction)t1
group by userId,mn)t2;
3、分组TopN
有50W个店铺,每个顾客访客访问任何一个店铺的任何一个商品时都会产生一条访问日志,访问日志存储的表名为Visit,访客的用户id为user_id,被访问的店铺名称为shop。
需求:每个店铺访问次数top3的访客信息。输出店铺名称、访客id、访问次数。
step1:查询每个店铺被每个用户访问次数
因为我们最终需要获取每个店铺访问量top3的用户信息,所以在这一步,我们就先把每个店铺的每个用户的访问次数计算出来。
select shop,user_id,count(*) ct
from visit
group by shop, user_id;
t1
计算结果:
step2:计算每个店铺被用户访问次数排名
有了第一步每个店铺下所被访问用户的访问量,我们想获取前三,毫无疑问,我们需要使用到开窗函数 rank。
可能就有朋友问了,为什么不能用 row_number ?
主要还是 row_number 对于相同数据的排名不是一样的,如果我们取Topic3,出现了相同访问次数的数据,那我们肯定都得保留下来的对吧~~
select shop,user_id,ct,rank() over (partition by shop order by ct desc) rk
from t1;
t2
计算结果:
step3: 取每个店铺排名前3的数据
有了 step2 的结果,我们想要取每个店铺前三的数据岂不是轻而易举~
select shop,user_id,ct
from t2
where rk<=3;
计算结果:
完整SQL
好了,结果已经查询出来了,这里把上面step的SQL整合到一起~
select shop,user_id,ct
from (select shop,user_id,ct,rank() over (partition by shop order by ct desc) rkfrom (select shop,user_id,count(*) ctfrom visitgroup by shop,user_id) t1) t2
where rk <= 3;
结语
我们不论是看书还是刷题,不在于数量多少,而一定要求“精”。这就要求我们学会去思考,学会举一反三。真正具备解题能力的人,我相信一定不是把时间花在大量刷题上,而是懂得从不同类型的习题上,及时总结复习的人。
以上3道SQL“小菜”怕是满足不了大伙,以后有机会再为大家总结些别的题目,本篇文章到这里就结束了。对技术宇宙充满好奇,喜欢本文的朋友,可以扫码关注作者原创公众号【猿人菌】,我们下期见!
扫码关注
关注即可获取高质量思维导图,互联网一线大厂面经,大数据珍藏精品书籍...期待您的关注!
3道常见的SQL笔试题,你要不要来试试!相关推荐
- sql 以a开头的所有记录_#9#猴子聊数据分析之常见的SQL笔试题和面试题(下)
题目来源 猴子:常见的SQL笔试题和面试题(下)zhuanlan.zhihu.com 1.SQL语言允许使用通配符进行字符串匹配的操作,其中'%'可以表示:多个字符 2.通过 SQL,如何从 &qu ...
- 常见的SQL笔试题和面试题:SQL经典50题
常见的SQL笔试题和面试题(上):经典50题 已知有如下4张表: 学生表:STUDENT(S#,SNAME,SAGE,SSEX) 课程表:COURSE(C#,CNAME,T#) 成绩表:SC(S#,C ...
- sql a 表 若包含b表 则a 表 列显示_几道常见的SQL面试题,看你能答对几道?
分享几道比较常见的SQL面试题,在不看底部参考答案的情况下,看自己能做对几道. 1.用一条SQL 语句 查询出每门课都大于80 分的学生姓名 2. 学生表 如下: 删除除了自动编号不同, 其他都相同的 ...
- 常见的SQL笔试题和面试题(上):经典50题
题目转自:https://zhuanlan.zhihu.com/p/38354000 已知有如下4张表: 学生表:STUDENT(S#,SNAME,SAGE,SSEX) 课程表:COURSE(C#,C ...
- 常见的php笔试题(附答案)搜集整理
转载链接:http://www.yaojinbu.com/p/139.html 常见的php笔试题(附答案)搜集整理 1.在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在哪个预定义变量中?而 ...
- 分享18道Java基础面试笔试题
转载自 分享18道Java基础面试笔试题(面试实拍) 1.你最常上的两个技术站和最常使用的两个app分別进什么?主要解决你什么需求? 2.请简述http协议中get请求和post请求的区别. 3.请简 ...
- Android开发面试经——2.常见Android基础笔试题
标签: androidAndroid基础Android面试题Android笔试题 2015-03-12 15:04 3361人阅读 评论(3) 收藏 举报 分类: Android开发(29) 版 ...
- 干货!常见的SQL面试题:经典50例!
来自:CSDN,作者:sh_c_2450957609 链接:https://blog.csdn.net/u010565545/article/details/100785261 SQL在数据分析中举足 ...
- java ajax面试题_几道Web/Ajax的笔试题
一.说说你常用的几个jsp隐式对象,例如PageContext等, 二.简述你对Java Web MVC设计模式的理解. 三.如果接触过webwork2.spring开源框架,简单评诉对它们的理解. ...
- 【常见c语言笔试题嵌入式软件开发2】
[常见c语言笔试题嵌入式软件开发2] 内容来自B站博主 C语言笔试嵌入式软件开发视频讲解 1>下面这段代码int main(){fork() || fork();}共创建几个进程 从运行结果来分 ...
最新文章
- mpp新增一个字段_如何快速新增百万测试数据?
- hdu4861 找规律了
- Static Final用法
- JavaScript Onclick事件解释
- 统计通话次数和时间的软件_通话时间统计app下载|通话时间统计安卓版下载 v1.0.3 - 跑跑车安卓网...
- 【CVPR2019】 教程 Tutorials List
- Java案例:读取文本文件部分内容
- 《Essential C++》笔记之return;分析
- 全新 AI 语音芯片、双麦 AIoT 模组,科大讯飞硬核技术助力智能家电创新
- [置顶] 使用Joson的格式字符串在Socket中通讯时数据格式的转换
- Unity3d中的属性(Attributes)整理【转载】
- python工程师干什么的_Python就业前景和工资待遇分析,你学Python了吗?
- 用C++完成三国杀(无GUI)
- Python 人脸识别系统
- 8.tendermint多节点组网
- 如何在Raspberry Pi和ESP8266中使用MQTT
- hdu 4009 Transfer water(最小树形图模板)
- 8051单片机Proteus仿真与开发实例-OLED显示屏(SSD1306控制器)I2C驱动显示中文及图片仿真
- 专转本计算机必背知识点,江苏专转本计算机必考重点(精华版).doc
- Andorid中使用Gson和Fast-json解析库解析JSON数据---第三方库学习笔记(二)