关注小聚,数据分析不迷路
说起SQL,数分岗位的必备技能之一。在面试时总会问到,旨在评估应聘者的技术和解决问题的能力。今天在这篇文章中,小聚将介绍 SQL 面试问题中常见的模式,并提供一些在 SQL 查询中巧妙处理它们的技巧。
sql的能力分为入门,实战两个阶段,具体看你面试的岗位要求的水平。一般SQL分为增,删,改,查四大能力。很多人都以为按这个顺序应该先写增,删,改,但其实往往工作中真正用到的是查。
sql中的查也就是select语句,语法不难,但是要达到实战的水平,最好还是经过一阵练习,达到遇到一般问题(注意工作中都是一般问题),你可以比较快的写出select查询语句去解决就算有实战能力了。
常见SQL考察方式
❶ 笔试阶段,网上答题。包括PDD,携程,网易在内很多公司都会在笔试的时候来几个SQL作为筛选条件。网上答题的时候很有可能遇到变态的题目……只能多搜搜这些公司在往年笔试时候出题内容,然后进行针对性的准备了。
❷ 现场面试写代码。在面试小红书,网易的时候,面试官也会现场抽出几道SQL题让你写代码。现场写代码不会遇到太难的题目,一般窗口函数排个序可以搞定,再难点也就是求中位数、众数这些。
❸ 远程面试口述语法。像蘑菇街,趣头条,招银网络科技等等,是在远程面试(或者电面)的时候随便问起SQL常见的语法。以经验来看,电面的考察侧重于提问相似函数的不同点,毕竟让你口述一段代码也不现实……
面试小技巧
问问题(前提准备)
要搞定一场 SQL 面试,最重要的是尽量多问问题,获取关于给定任务和数据样本的所有细节。充分理解需求后,接下来你就可以节省很多迭代问题的时间,并且能很好的处理边缘情况。
许多同学经常还没完全理解 SQL 问题或数据集,就直接开始编写解决方案了。之后,等面试官指出他们解决方案中存在的问题后,他们只好反复修改查询。最后,他们在迭代中浪费了很多面试时间,甚至可能到最后都没有找到正确的解决方案。
建议大家在参加 SQL 面试时,就当成是自己在和业务伙伴共事。所以在你提供解决方案之前,应该要针对数据请求了解清楚所有的需求
三个tips
❶ work backwards
在看到面试题目的时候,先想一下你最后要的表是什么样的,primary key是什么,summary stats是什么,然后从已有的表里面如何推到你想要的表。这个步骤建议大家think out loud。面试中最忌讳自己在默默的想,不和面试官交流,你在展现你的思路的时候,既能帮助你更好理清思路,也能保持和面试官的交流。这在上面其实已经提过了。
❷ 巧用with语句
当你的语句超过两个from的时候,整个script就会非常的复杂,所以建议用with语句,每次需要改变primary key的时候都建一个新表,合理命名让你在下一步可以直接用简单的column name
❸ 思考corner case
如果你的表格里有null值,你会怎么处理?根据题目的条件,是不是用别的值代替?如果你的分母可能是0,怎么办?是不是要用safe_divid代替普通的slash/。写完了以后再检查一下有没有丢一些语句或者没有考虑到corner case。
必备知识点
❶ window function
window function在我看来是不改变data的行数的情况下,把group by的一些stats分到了每一行。比如说 sum(revenue) over (partition by country) 就是把每个country的revenue加了一下,行数和原来不变,所有美国的行的这个数据都是美国revenue的总和。常见的window function还有RANK等。在这里着重讲一下RANK()、DENSE_RANK()、ROW_NUMBER()三者排序的不同:
-
RANK()返回的是不持续的编号,例如100, 101, 101, 102返回的编号将是1,2,2,4;
-
DENSE_RANK()返回的是持续的编号,例如100, 101, 101, 102返回的编号是1,2,2,3;
-
ROW_NUMBER()返回的是持续不重复的编号,例如100, 101, 101, 102返回的编号将是1,2,3,4;
❷ join的区别
一共有5种join语,left, right, inner, full outer, cross join。目的都是一样的,就是用相同的key把两张表的column并起来。
left就是keep所有在左边的数据的行数,无论右边能不能找到对应的key。inner就是只keep两张表共同的key,full outer join就会把两张表所有的行保留。cross joi会把两张表每一行都和另一张表的每一行join,这个计算量非常大,一般要尽量避免。
数据分析场景案例描述
有些公司在判断应聘者的SQL能力时,通过其处理过的数据场景就知道大概是什么水平。
如果没有SQL笔记或者面试官没有问你具体的SQL实现的案例描述。那建议你自己说一下,你使用SQL处理哪些场景。例如,以下比较经典的数据分析场景:
-
场景一:查询各种数据指标。主要证明你的SQL基本数据,单表查询,多表查询。例如:订单金额大于100的,订单量,会员数。
-
场景二:计算会员的复购时间。例如:过去半年内,新会员如果有复购的,复购时间分布。
-
场景三:行列转置的报表场景。例如:会员,日期,金额;转化为:和进列是会员ID,行是月份,指标的销售金额 。
-
场景四:分析函数。计算会员的排名,计算累计销售等。
如果以上能掌握,基本你的SQL能力能被认为达到基本处理工作没有问题的水平了。
小结
SQL的基本知识点不难,难的是如何灵活运用,怎么结合实际需求,通过花式操作以及层层嵌套得到最终想要的结果~
所以再次强调:在面试期间,一定要保持交流持续进行!!!