数据分析|SQL面试题集锦

article/2025/10/3 11:51:10

https://zhuanlan.zhihu.com/p/136619982

https://www.cnblogs.com/diffrent/p/8854995.html

 

1.用一条SQL 语句 查询出每门课都大于80 分的学生姓名

name   kecheng   fenshu
张三    语文       81
张三     数学       75
李四     语文       76
李四     数学       90
王五     语文       81
王五     数学       100
王五     英语       90

A:  select distinct name from table where name not in (select distinct name from table where fenshu<=80)
B:  select name from table group by name having min(fenshu)>80

 

写在前面

SQL可谓是数据分析必备技能之一了,面试中也是高频出现,初学SQL可以阅读《SQL必知必会》

全书通俗易懂,看完之后可以到牛客网和LeetCode刷一些SQL题巩固巩固。

数据库SQL实战_牛客网​www.nowcoder.com

 

题库 - 力扣 (LeetCode)​leetcode-cn.com图标

不过面试中的SQL大多都是结合部门业务,这里将我自己经历过的和之前看到的一些面试题收集整理过来,前期顺序可能比较乱,之后陆陆续续会归类分析。

目录(2020-05-18)

  1. 用户签到问题
  2. 销售情况问题
  3. sql去重操作
  4. 相邻间隔问题
  5. count(1)、count(*)和count(列名)的区别

切入正题

1. 用户签到问题

<题目>

给定一张用户签到表user_attendence,表中包含三个字段,分别是用户ID:【user_id】,日期:【date】,是否签到:【is_sign_in】,0否1是。

<问题1> 计算截至当前,每个用户已经连续签到的天数:

要求输出用户ID【user_id】和连续签到天数【recent_continuous_days】

<问题2> 计算有史以来用户最大连续签到天数:

要求输出用户ID【user_id】和最大连续签到天数【max_continuous_days】

<解题思路>

针对问题1,这里有一种非常巧妙的解法:只需要利用Max和datediff函数,也就是说只要找到用户最近一次没有签到的日期,计算和当前日期的差值即可。

针对问题2,可以将是否签到转换为一条0-1字符串序列,用0做split切割,计算切出来的1序列组中的最大长度。也可以运用窗口函数row_number,给所有签到记录为1的列排序号,这里也有一种很巧妙的思想,就用每行的签到日期减去序号,如果签到日期是连续的话,求得的值则是相同值,一旦日期不连续,将会求得一个新的相同值,这样的话,可以统计每个值的数量,进而判定最长签到天数。

举个栗子,下图为用户1在4月20日到4月27日的签到记录,其中4月23日没有签到,可以发现差值为19和20,其中20出现次数最多,有4次,说明该用户最大连续签到天数为4天。

不过有一点值得注意的是,求得的【值】必须唯一,上图中的数字显然不唯一。这里可以用日期去当作这个【差值】,毕竟日期具有唯一性,可以考虑运用MySQL中的DATE_SUB函数。

如果对窗口函数不了解的话,可以看我这个文章:

狗哥:数据分析|SQL窗口函数​zhuanlan.zhihu.com图标

<答案>

# 求截止当前的连续签到天数
SELECT user_id, DATEDIFF('2020-04-27', max_date) AS recent_continuous_days
FROM (SELECT user_id, MAX(date) AS max_dateFROM user_attendenceWHERE is_sign_in = 0GROUP BY user_id) AS b# 求有史以来的最大连续签到天数(窗口函数)
SELECT b.user_id, MAX(b.continues_day) as max_continuous_days
FROM (SELECT a.user_id, DATE_SUB(a.date, INTERVAL a.rn DAY) AS difference, COUNT(*) AS continues_dayFROM (SELECT user_id, date, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY date) AS rnFROM user_attendenceWHERE is_sign_in = 1) AS aGROUP BY a.user_id, difference) AS b
GROUP BY b.user_id

2. 销售计算问题

<题目及问题>

<解答>

这里用的办法比较复杂,主要涉及到了row_number、if和round函数,仅作参考

SELECT a.t_year, ROUND(SUM(IF(a.t_region = '华南', a.t_money, 0)), 2) as '华南总收入',ROUND(SUM(IF(a.t_region = '华北', a.t_money, 0)), 2) as '华北总收入',ROUND(SUM(IF(a.t_region = '华南', a.t_money, 0)) / SUM(cicy_hn), 2) as '华南平均收入',ROUND(SUM(IF(a.t_region = '华北', a.t_money, 0)) / SUM(cicy_hb), 2) as '华北平均收入',if(a.ranknumber = 1, a.t_city, 0) AS 销售第一FROM (SELECT t_year, t_region,t_city,t_money,  if(t_region = '华南',COUNT(t_region), 0) AS cicy_hn,if(t_region = '华北',COUNT(t_region), 0) AS cicy_hb,ROW_NUMBER() OVER (PARTITION BY t_year ORDER BY t_money DESC) AS ranknumberFROM sql2GROUP BY t_year, t_city) AS aGROUP BY t_year

输出如下:

3. 去重问题

请移步

狗哥:数据分析|记一“道”难忘的SQL面试题...​zhuanlan.zhihu.com图标

4. 相邻间隔问题

请移步

狗哥:数据分析|SQL面试题—相邻间隔问题​zhuanlan.zhihu.com图标

5. count(1)、count(*)和count(列名)的区别

  • 从执行结果来看

- count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL

- count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL

- count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计

  • 从执行效率来看

- 如果列为主键,count(列名)效率优于count(1)

- 如果列不为主键,count(1)效率优于count(列名)

- 如果表中存在主键,count(主键列名)效率最优

- 如果表中只有一列,则count(*)效率最优

- 如果表有多列,且不存在主键,则count(1)效率优于count(*)

6. 某一时间点最大在线人数问题

<题目>

给定一张用户进入直播间事件表user_live,表中包含四个字段,分别是直播间id:【live_id】,用户ID:【user_id】,进入时间:【login_time】,退出时间:【logout_time】

<问题1> 计算每分钟最大在线人数

<解题思路>
假如我们用一个变量user_cnt记录当前在线人数,那么有用户进入则+1,有用户退出则-1。其实也就是只有在用户进入或者退出时,才会有人数变化。所以可以先对原数据做一些格式上的处理,将进入退出时间统称为事件时间,增加一个时间类型(1进入、-1退出),如下所示:

live_iduser_idevent_timeevent_type
100100012020-11-25 12:00:001
100100012020-11-25 12:30:00-1
100100022020-11-25 12:30:301

这样的话,就可以在每条记录后运用sum() over()窗口函数记录此时的用户数,大概思路如下

   selectsum(event_type) over(order by event_time) as sum_user --排序后第一行到本行的和from(selectorder_id,unix_timestamp(login_time) as event_time,1 as event_typefromuser_livewhere‘限定条件’union allselecorder_id,unix_timestamp(logout_time) as event_time,-1 as event_typefromuser_livewhere‘限定条件’)a  

最后在根据需求对时间戳处理,求得某时间段的最大最小在线人数


http://chatgpt.dhexx.cn/article/Xs7uEVSo.shtml

相关文章

Sql面试50题 详解 持续更新

Sql面试50题 前言&#xff1a;此文章是根据【数据分析】- SQL面试50题 - 跟我一起打怪升级 一起成为数据科学家 学习整理而来&#xff0c;仅供复习参考。 建表与插入数据 --建立学生表 CREATE TABLE Student( s_id VARCHAR(20), s_name VARCHAR(20) NOT NULL DEFAULT , s_bi…

大厂SQL面试题,连续时间问题

今天分享一个非常常考&#xff0c;同时也不太容易的sql题目类型&#xff0c;求连续时间问题。 这类题的核心是&#xff1a;分组排序&#xff0c;用时间减去排序&#xff0c;如果连续的话他们的差会是相同值 记住下面的表&#xff0c;按照提供的三步思路理清楚里面的数据逻辑&a…

经典Hive-SQL面试题及答案

目录 第一题 求分区累加值 第二题 UV和每个店铺访问量top3信息 Hive sql解答 第一题 求分区累加值 我们有如下的用户访问数据 userId visitDate visitCount u01 2017/1/21 5 u02 2017/1/23 6 u03 2017/1/22 8 u04 2017/1/20 3 u01 2017/1/23 6 u01 2017/2/21 8 U02 2017/1/…

吊打面试官之SQL面试题30问及答案

经典SQL30问一: 编写查询,查找表中的行总数。编写查询,消除表结果中的重复记录。编写查询,获取t_employee表中designation字段前3个字符。查询t_employee表,合并输出Designation和Department两个字段的内容。如果使用union和union all合并4条SQL子查询,union会有多少次被用来去…

pl sql面试题_PL SQL面试问答

pl sql面试题 If you have worked on Oracle database and going for an interview, you should go through PL SQL interview questions and answers. 如果您曾经在Oracle数据库上工作过并且要进行面试,则应该阅读PL SQL面试问题和答案。 PLSQL stands for Procedural Langu…

常见的sql面试题

本章是SQL面试题的汇总,之后还会不断更新,文章的思维导图如下: 1.SQL初级查询 单表查询 -- 查询学生表中有几名学生的信息.显示学号 select distinct 学号 from student;查询条件 -- 查询学生表中性别为女的学生所有信息 SELECT * FROM student WHERE 性别女;结果排序 -- …

美团/得物sql面试题

解题思路: 1.找出uid不同的但是买过pro_id相同的商品的用户 [自连接] selecta.uid,b.pro_id fromtb_order ajoin tb_order bon a.pro_id b.pro_id where a.uid <> b.uid -- 找出uid不同的但是pro_id相同的商品2.对uid和pro_id进行分组 selecta.uid,a.pro_id fromtb…

Spark SQL面试题

1.RDD DataFrame DataSet的区别 &#xff08;1&#xff09; 三者之间的关系 DataFrame是特殊的RDD(它相当于RDDschema&#xff0c;即RDD表信息)&#xff0c;可以将他看成数据库中的一张数据表&#xff0c;但是只知道这个"表"中的各个字段&#xff0c;不知道各个字段…

SQL常见面试题

SQL常见面试题关系型数据库&#xff08;SQL&#xff09;非关系型数据库&#xff08;NoSQL&#xff09;数据库三大范式主键与外键CHAR与VRCHAR数据类型临时表数据库函数、触发过程与存储器 SQL语句SQL语言分类DROP、TRUNCATE、DELETE的区别sum、count(\*)、count(1)、count(colu…

常见的SQL面试题:经典50例

SQL基础知识整理 select 查询结果&#xff0c;如: [学号,平均成绩&#xff1a;组函数avg(成绩)] from 从哪张表中查找数据&#xff0c;如:[涉及到成绩&#xff1a;成绩表score] where 查询条件&#xff0c;如:[b.课程号0003 and b.成绩>80] group by 分组&#xff0c;如:…

5个必考的大厂SQL面试题

学Python的同学&#xff0c;SQL也一定要学习&#xff0c;SQL几乎是每个数据岗的必备题目&#xff0c;下面分享几个常见的大厂SQL习题。 &#xff08;1&#xff09;找出连续7天登陆&#xff0c;连续30天登陆的用户&#xff08;小红书笔试&#xff0c;电信云面试&#xff09;&am…

7 大开源数据库利弊全对比

1、CUBRID CUBRID 是一个很好的免费开源选择&#xff0c;专门针对 Web 应用程序进行优化&#xff0c;当复杂的 Web 服务需要处理大量数据并生成巨大的并发请求时&#xff0c;CUBRID 非常有用。这个解决方案是用 C 写的。 优点&#xff1a; 多粒度锁定 在线备份 用于开发语言…

还在用Navicat?这款开源的数据库管理工具界面更炫酷!

数据库管理工具&#xff0c;是后端程序员使用频率非常高的的工具。Navicat、DataGrip虽然很好用&#xff0c;但都是收费的。最近在逛Github的时候&#xff0c;无意间发现了一款开源的数据库管理工具Beekeeper Studio&#xff0c;界面非常炫酷推荐给大家&#xff01; Beekeeper…

开源数据库管理系统现在比商业产品更受欢迎

原文链接&#xff1a;https://db-engines.com/en/blog_post/86 2021年1月13日 作者&#xff1a;马蒂亚斯盖尔曼&#xff08;Matthias Gelbmann&#xff09; Matthias Gelbmann是奥地利维也纳Solid IT联合创始人&#xff0c;董事总经理兼顾问。 Matthias Gelbmann在维也纳学习了…

你了解世界上功能最强大的开源数据库吗?

如果不是领导强制要求&#xff0c;可能根本不会留意到这款号称世界上功能最强大的开源数据库——PostgreSQL。如果你不读这篇文章&#xff0c;或许也会错过一个跃跃欲试想挤进前三的优秀数据库。 为了能够熟练运用&#xff0c;特意买书研究&#xff0c;发现这款数据库还真有点…

开源数据库列表

转载于&#xff1a;http://database.csdn.net/subject/databaseopen.htm 编辑导语 开源数据库最初的诞生和发展大都依靠自由软件开发者&#xff0c;但是&#xff0c;现在越来越多的IT公司开始把触角伸向了开源数据库。而早期投身于其中的IT厂商早已获利&#xff0c;比如Sleepy…

TuGraph 开源数据库体验

TuGraph 开源数据库体验 文章目录 TuGraph 开源数据库体验1. 简单介绍2. 可视化界面体验&#xff1a;查询界面&#xff1a;数据建模&#xff1a;数据导入&#xff1a; 3. 体验心得&#xff1a; 1. 简单介绍 TuGraph 是蚂蚁集团自主研发的大规模图计算系统&#xff0c;提供图数…

数据库与开源的未来

大家好&#xff0c;社区的小伙伴可能已经发现CnosDB已经全面拥抱Rust。我们一直高度关注行业趋势的发展&#xff0c;拥抱新兴的语言和前沿的技术。本期Jesse就想跟大家聊聊数据库与开源的未来。 本文仅代表个人观点&#xff0c;如有偏颇之处&#xff0c;还请海涵&#xff5e; …

做了7年开源数据库开发,我学到了什么?

作者 | PHILIP OTOOLE&#xff0c;已获作者授权 译者 | 弯月 责编 | 欧阳姝黎 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 2016年4月9日&#xff0c;第一版rqlite&#xff08;https://github.com/rqlite/rqlite/releases/tag/v1.0&#xff09;正式发布&a…

【数据库】什么是 PostgreSQL?开源数据库系统

文章目录 前言什么是 PostgreSQL&#xff1f;PostgreSQL 中的 SQL服务器管理接口 PostgreSQL 用途通用 OLTP&#xff1a;联合中心&#xff1a;地理空间&#xff1a;LAPP 堆栈&#xff1a; 使用 PostgreSQL 有什么好处&#xff1f;开源许可证&#xff1a;易于扩展&#xff1a;可…