查看原文
其他

有幸去华为面试数据分析岗,看到SQL后我拒绝了

The following article is from 统计与数据分析实战 Author 严小样儿


◆ ◆ ◆  ◆ ◆



面试真题


今年8月,有幸参加了华为的面试,虽然是外包身份,但是大家都知道,大公司对于外包的面试其实就是华为内部人员来进行。腾讯也是如此!岗位是数据分析,记忆最深刻的就是考察了SQL行转列。SQL,无疑是在数据分析面试过程中的重头戏。很多人说,SQL不重要,不能只做提数机器;还有人说,面试不需要准备SQL,只要你懂方法就足够了。呵呵一笑置之!如果你真的懂数据分析的方法与思路,还愁找不到工作吗?还会整天迷茫?所以沉下心来,好好练习SQL吧。即使做个提数机器,也要做到提数又快又准确,否则和咸鱼有什么区别?!


SQL提数,准确性是第一位的。准确性如何把握?关键在于你的理解需求能力、逻辑思维能力、执行原理掌握的程度。需求理解出错,从根上就是不可能提取到需要的数据。SQL执行原理中,我认为一定要把SQL子句的执行顺序搞清楚。




在日常工作中,或者面试过程中,常常会碰到要求用SQL语句实现行转列。形式如下:

 

select * from test ;



而面试官要求查询结果如下展示:



或者这样:






case when方法


其实很简单~我们可以使用case when语句进行行转列操作。代码如下:



case 1

select name , max(case when subject='语文' then score else 0 end) as 语文 , max(case when subject='数学' then score else 0 end) as 数学 , max(case when subject='英语' then score else 0 end) as 英语 from test group by name ;


case 2

select name , sum(case when subject='语文' then score else 0 end) as 语文 , sum(case when subject='数学' then score else 0 end) as 数学 , sum(case when subject='英语' then score else 0 end) as 英语 from test group by name ;


以上两种代码都可以实现行转列,细心的同学可能会发现其实只有max和sum的区别。其实,max、sum最主要的用途就是聚合作用——以name分组聚合。为了让大家更好的理解sum或max的作用,我们先展现一下不加聚合函数的效果。


select name , case when subject='语文' then score else 0 end as 语文 , case when subject='数学' then score else 0 end as 数学 , case when subject='英语' then score else 0 end as 英语 from test ;



很明显,我们需要以name进行分组聚合,这样才能得到满足条件格式的输出。而用max还是sum进行聚合,没有任何区别。


求总分

select name , max(case when subject='语文' then score else 0 end) as 语文 , max(case when subject='数学' then score else 0 end) as 数学 , max(case when subject='英语' then score else 0 end) as 英语 , sum(score) as 总分 from test group by name ;


窗口函数方法

同时,再给大家介绍一下以窗口函数进行聚合的案例。代码如下:


select name ,       max(case when subject='语文' then score else 0 end) over( partition by name ) 语文 ,       max(case when subject='数学' then score else 0 end) over( partition by name ) 数学 ,       max(case when subject='英语' then score else 0 end) over( partition by name ) 英语 from test ;


同理,上面的聚合函数max也可以用sum替换,不再赘述!



很明显,结果需要去重!但是,在实际的生产过程中可能不需要去重,而且不是重复的,这个谜题留给大家思考!


select distinct name ,       sum(case when subject='语文' then score else 0 end) over( partition by name ) 语文 ,       sum(case when subject='数学' then score else 0 end) over( partition by name ) 数学 ,       sum(case when subject='英语' then score else 0 end) over( partition by name ) 英语 from test ;


通过上面的比较发现,不同情况使用不同的语句为好。如果你想查询更多字段,那么窗口函数不失为一种选择;如果只需要查询一个字段,如name,那么建议大家还是使用groupby为好。在实际生产中,查询字段远远不止一个,一般不会重复,所以也就不需要去重了。


结束语


在一面后,我当面果断拒绝了华为负责人。没有职业规划,只会越工作越穷。对于数据分析师,SQL最起码需要掌握两方面内容:查询+优化。查询,需要多多练习,可以去力扣做题;优化,需要一定的经验,以及对数据库原理的充分掌握。转行面试,其实也并不容易。千里之行始于足下,加入我们一起成长。关注公众号,领取学习资料吧。



更多精彩

欢迎加入数据BI技术交流群。进群方式:请加小助微信(微信号:iom1128),回复:数据,审核通过 会自动拉你进群。


今日荐文

点击下方文字即可阅读

  1. 数仓蓝图:如何优雅地规划数仓体系

  2. 阿里重磅开源机器学习平台 Alink

  3. 有赞数据治理体系与架构

  4. 美团 数据质量平台 设计与实践

  5. 2020互联网大厂薪资出炉!

  6. DataX在有赞大数据平台的实践

  7. 分布式任务调度平台 XXL-JOB

  8. 基于Spark分析实践(文末答疑)

  9. Flink Forward 2019 - PPT下载

  10. 大数据生死时刻 



觉得内容不错的话 请分享到朋友圈哦~
▼ 福利时刻 ▼ 


01. 后台回复「经典」,即可领取大数据数仓经典书籍。


技术大佬们在等你,各种资源定期分享~

Q: 关于数据仓库,你还想了解什么?

欢迎留言区与大家分享

觉得不错,请把这篇文章分享给你的朋友哦

入群请联系小助手:iom1128『紫霞仙子』

更多精彩,请戳"阅读原文"到"数仓之路"查看

更多精彩,请戳"阅读原文"到"数据分析"查看

 

 

关注不迷路~ 各种福利、资源定期分享


在看”的永远18岁~

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存