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

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

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篇的内容,部分数据分析面试笔试请翻看历史文章,更多数据分析干货文章持续更新中,敬请期待,如果觉得不错,也欢迎分享、点赞和点在看哈

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容