更多数据分析思维、工具、实际项目和面试面经文章请移步共粽号:【数据分析星球】。

01 写在前面

无论你是刚毕业的职场小鲜肉、还是想转行数据分析的小白玩家,只要想进入数据分析的行业,都逃不过数据分析面试的考验,这里最重要也是最关键的一关就是SQL笔试了,不过不用担心,结合作者6年+的工作和面试经验,系统全面地整理了数据分析面试中那些高频出现的以及各大厂的SQL笔试题,学习了这些笔试题的常见套路和解法,把这些题目都刷一遍,在接下来的笔试中应该可以一往无前,收割offer啦!

数据分析笔试中最常见也是最有难度的就是SQL窗口函数了,SQL窗口函数作为SQL的高阶语法,也是数分工作中最常用的分析函数,也是面试中最常考查的知识点,本文就讲解了各大厂考查的窗口函数题目,通过这些题目就能熟练掌握这个知识点了。

02 计算连续活跃

连续活跃或者登录的计算是数据分析业务场景中非常经典和常见的问题,而且涉及到的解题思路比较巧妙,所以也是面试笔试中非常喜欢考查的知识点,通过下面的笔试题的详细讲解,希望小伙伴们可以举一反三,把计算连续这类问题吃透。

记录用户活跃时间信息的表user_active如下:

需求:计算连续活跃2天及以上的用户。

第1步:用户活跃日期去重
因为一个用户同一天可能活跃多次,我们只需要知道用户在某天是否活跃即可,所以需要对用户id+活跃日期去重。

select DISTINCT
cast(active_time as date) active_day,
userid
from user_active;
查询结果:

第2步:窗口函数按日期排序
有了第1步去重后的结果,我们可以用row_number() 函数对其进行开窗,以userid分组,日期升序排序,得到每个用户按照日期升序的排名。

select *,
row_number() over(PARTITION by userid
order by active_day) as rn
from
(
select DISTINCT
cast(active_time as date) active_day,
userid
from user_active;
)a;
查询结果:

看到这里,有些小伙伴可能就比较疑惑了,为什么要在这一步对日期进行排序呢?这也是计算连续活跃、达标逻辑比较tricky的地方,因为我们用row_number排序之后的名次是连续的,那么如果恰巧日期也是连续的,日期和排序差值不就是一个固定的值了吗?所有连续的日期是不是都被这个固定的值圈定了?

第3步:确定连续日期的分组
按照上面所说的逻辑,我们使用date_sub函数将当前日期active_day和当前的排序值rn相减,得到一个新的列,命名为"day_group"

select *,
date_sub(active_day,rn) as day_group
from
(
select *,
row_number()over(PARTITION by userid
order by active_day) as rn
from
(
select DISTINCT
cast(active_time as date)active_day,
userid
from user_active;
)a
)b;
查询结果:

第4步:根据分组列计算连续天数
最后一步,我们直接根据第3步中获取到的分组列,根据userid和分组列进行分组求count即可。如果是要求连续活跃2天以上,我们直接对聚合后的count 用having进行过滤即可。

select userid,day_group,
count(*) as continous_days
from
(
select *,
date_sub(active_day,rn) day_group
from
(
select ,
row_number()over(PARTITION by
userid order by active_day) as rn
from
(
select DISTINCT
cast(active_time as date)active_day,
userid
from user_active
)a
)b
)c
GROUP BY userid,day_group
having count(
)>=2;
查询结果:

到这里结果就出来了,userid为10001和10002的用户都连续活跃了3天,也就是符合我们条件的用户。

03 计算累计指标

求累计也是数据分析实际业务中非常常见的场景,截止到每天的累计销售额、截止到每天的注册用户数,可以通过这些指标来看KPI完成情况。所以累计的计算也是笔试中经常出现的题目,下面通过一个案例讲解如何计算累计,抛砖引玉,希望大家能举一反三。

记录每个商品每天销售量的表sale_info如下图:

需求:使用SQL统计出每个商品截至每个月的累积销量。

第1步:计算每个商品每个月的销量
为了方便后面的讲解,我们把这一步操作的结果存在临时表tmp中,第1步我们先计算每个商品每个月的销量。

create table tmp as
select
product_id,
substring(sale_date,1,7) sale_month,
sum(quantity) month_quantity
from sale_info
group by
product_id,
substring(sale_date,1,7);
查询结果:

第2步:按月累计计算销量
到这一步,我们用sum开窗函数,对userid进行分组、按照月份进行排序即可完成累计销量的计算。

select
product_id,
sale_month,
month_quantity,
sum(month_quantity) over(
partition by product_id
order by sale_month) month_all
from tmp;
查询结果:

完整的SQL代码如下:

select
product_id,
sale_month,
month_quantity,
sum(month_quantity) over(
partition by product_id
order by sale_month) month_all
from
(
select
product_id,
substring(sale_date,1,7)sale_month,
sum(quantity) month_quantity
from sale_info
group by product_id,
substring(sale_date,1,7)
)t;

04 去除最高最低的平均

salary_info表记录了每个员工的月工资以及所属的部门,包含EmpId(员工ID)、Department(部门名称)、Salary(月工资)。

需求:计算除去部门最高工资,和最低工资的平均工资(字节跳动面试)。

因为要在每个部门内计算平均工资,但是要去除该部门的最高工资和最低工资,所以我们可以考虑使用窗口函数,按照部门进行分组,但是如何将部门的最高工资和最低工资去除呢?我们可以对分组后的数据按照工资分别顺序和逆序进行排序,排名第一的就分别是该部门最低和最高工资,将这2个排名第一的记录去除就是我们要计算的平均工资。

核心是使用窗口函数RANK分别对工资salary进行升序和降序排列,就获得了该分组内最低和最高的工资,过滤掉这2条记录再对工资salary进行平均avg即可。

完整SQL代码如下:

select a.department,avg(a.salary)
from
(
select *,
rank() over( partition by department
order by salary ) rank_asc,
rank() over( partition by department
order by salary desc) rank_desc
from emp
) a
group by a.department
where a.rank_asc >1
and a.rank_desc >1

面试或者笔试的过程中会设定各种各样的场景,在这些场景下考查我们SQL的查询能力,但是万变不离其宗,业务场景只是一个表现形式,抽象为SQL问题后其实基本上就是我们这篇文章介绍的几类问题:计算累计、连续,分类TopN等。只要掌握这些问题的解法,并且可以举一反三,并不需要盲目的花费大量的时间精力去刷题,多总结多思考,你就很容易在面试笔试环节脱颖而出了。

以上就是数据分析面试—SQL高频笔试题系列第2篇的内容,部分数据分析面试笔试请移步共粽号:【数据分析星球】,更多数据分析干货文章持续更新中,敬请期待,如果觉得不错,也欢迎分享、点赞和收藏哈~

【数据分析面试】大厂高频SQL笔试题(二)相关推荐

  1. sql 以a开头的所有记录_#9#猴子聊数据分析之常见的SQL笔试题和面试题(下)

    题目来源 猴子:常见的SQL笔试题和面试题(下)​zhuanlan.zhihu.com 1.SQL语言允许使用通配符进行字符串匹配的操作,其中'%'可以表示:多个字符 2.通过 SQL,如何从 &qu ...

  2. 尚硅谷-互联网大厂高频重点面试题 (第2季)JUC多线程及高并发

    本期内容包括 JUC多线程并发.JVM和GC等目前大厂笔试中会考.面试中会问.工作中会用的高频难点知识. 斩offer.拿高薪.跳槽神器,对标阿里P6的<尚硅谷_互联网大厂高频重点面试题(第2季 ...

  3. 常见的SQL笔试题和面试题:SQL经典50题

    常见的SQL笔试题和面试题(上):经典50题 已知有如下4张表: 学生表:STUDENT(S#,SNAME,SAGE,SSEX) 课程表:COURSE(C#,CNAME,T#) 成绩表:SC(S#,C ...

  4. 尚硅谷_2019互联网大厂高频重点面试题(第二季)思维导图脑图笔记完整版

    尚硅谷_互联网大厂高频重点面试题第2季思维导图笔记下载,git部分未记录(尚硅谷周阳老师的视频脑图) ,内容包括JUC多线程并发.JVM和GC等目前大厂笔试中会考.面试中会问.工作中会用的高频难点知识 ...

  5. 【转】IT名企面试:腾讯笔试题(2)

    摘要:想要进入腾讯公司,面试笔试题是一定要有所准备的.那么这里我们总结了一些腾讯笔试题,例如:const的含义及实现机制等问题. 腾讯是国内数一数二的IT企业了.那么每年想要进入腾讯公司的应聘者也是络 ...

  6. 【面试】iOS 开发面试题(二)

    [面试]iOS 开发面试题(二) 1. 我们说的oc是动态执行时语言是什么意思? 答案:多态. 主要是将数据类型的确定由编译时,推迟到了执行时. 这个问题事实上浅涉及到两个概念.执行时和多态. 简单来 ...

  7. Java面试手册——高频问题总结(二)

    这里将Java集合和垃圾回收的知识总结,放到(二)中.对Java平台的理解.Java基础知识.面向对象请参考Java面试手册--高频问题总结(一) Java高频问题面试: 序号 文章 1 Java面试 ...

  8. oracle sql 题目,oracle sql笔试题

    oracle sql笔试题 一. 数据库 ORACLE 虽然这些题目都可以G到,但还是要考察一下您现在的常态水平,:) T表:(字段:ID,NAME,ADDRESS,PHONE,LOGDATE) E表 ...

  9. 某大厂软件测试岗一面笔试题+二面问答题面试经验分享

    目录 某大软件测试厂笔试题 选择题 二面 某大软件测试厂笔试题 判断题(Y=对,N=错) 1.软件测试的目的是尽可能多的找出软件的缺陷.(Y) 2.Beta测试是验收测试的一种.(Y) 3.验收测试是 ...

  10. 1000道最新大厂高频Java面试题,覆盖25个技术栈(多线程、JVM、高并发、spring、微服务、kafka,redis、分布式)从底层原理到架构

    每个技术人都有个大厂梦,我觉得这很正常,并不是饭后的谈资而是每个技术人的追求.像阿里.腾讯.美团.字节跳动.京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司/小公司,如果说能够在这样的公司锻 ...

最新文章

  1. 昇思MindSpore年终盘点 | 看完这篇正式开启虎年!
  2. 如何用C#检查硬盘是否是固态硬盘SSD
  3. tab菜单的点击的动态效果和内容页面的关联显示jQuery
  4. java jpasswordfield_JAVA中JPasswordField实现密码的确认
  5. java ejb jsp 架构_JavaEE架构
  6. vsftpd:500 OOPS: vsftpd: refusing to run with writable root inside chroot ()错误的解决方法
  7. CVPR2021 用更好的目标检测器提取视觉特征!微软提出VinVL,基于更好的视觉特征,达到更强的多模态性能...
  8. 易学源码html,HTML
  9. 取英文名字的几个规则
  10. 在Hadoop集群实施成功后再次格式化名称节点,datanode无法加入集群的处理办法...
  11. java 错误声音播放器_JavaME 声音播放器的使用
  12. BI是什么意思?在企业应用中有哪些好处?
  13. 案例-canvas绘制雨滴
  14. Android混淆大法
  15. No.050<软考>《(高项)备考大全》【冲刺4】《软考之 119个工具 (2)》
  16. vb.net与vb的区别
  17. Win32汇编环境配置
  18. 使用大华设备开发行AI人流量统计出现时间不正确的原因分析
  19. 20220719暑假实习笔记
  20. 有关KeyStore的问题

热门文章

  1. UI控件Telerik UI for Silverlight发布R2 2019|附下载
  2. 从零开始打造自己的PHP框架——第3章
  3. 动软代码生成器连不上高版本(8.0+)的解决方法
  4. Windows Phone 7调用必应翻译服务
  5. python规模_基于python的百度迁徙2——迁徙规模指数(附代码)
  6. ch2 gpio应用:Buzzer封装
  7. 【生活】周末一起看看阿里动物园
  8. HanLP-地名识别调试方法
  9. 通过IP地址获取地理位置信息
  10. U8系统UFO报表无法打印