sql 分组统计_数据分析师快速掌握SQL基础

海牛学院的 | 第 597 

本文预计阅读 | 分钟

d9e72f9028e1be7d8d0fb40a2aac81d9.png

c403de2a66fd10cc3930329bca29be9d.gif

SQL技能是数据分析师的必备技能,作者在之前的文章《你不知道的数据分析师》中也提到了,数据分析师50%的时间都在写SQL。

本文将从一道数据分析师的SQL面试题开始分析讲解,期间,会涉及到SQL的基础操作和分析函数的使用等知识点,然后为大家总结出了一份快速掌握SQL基础的指南,希望能够帮助到SQL初学者。

一道SQL面试题

这是一道来自百度数据部门的面试题,主要考察row_number的使用。 题目:SQL语句如何查询各用户最长连续登录天数?如图左边是源表User,右边是需要达到的查询结果。 807c33dab5005edbbf43b0affc3df805.png 3a449a8e61cd1b443dbc63d2687ad3a3.pngStep 1 审题 3a449a8e61cd1b443dbc63d2687ad3a3.png 各用户最长的连续登录天数,先要确定连续登录的数据特征,日期表现为每个用户的后一天和前一天的差值为1,不能为大于1的值,一旦大于1也就间断了。 那么可以设置一列序号,如果是连续的话,这列序号也是会随着日期同步增长的,那么日期减去这个序号,应该都是一个确定的日期。 比如说2017年1月1号对应的序号是1,2017年1月2号对应的序号是2,2017年1月3号对应的序号是3,那么2017年1月1号-1=2016年12月31号,同理,2017年1月2号-2=2016年12月31号,都是同样的日期。 根据这个日期与序号之差和UID进行分组统计出不同UID和差值的数量,最后按照UID分组统计出数量的最大值。 具体流程见下图: dba5734efb508bc7c9efb64e95f002d5.png   3a449a8e61cd1b443dbc63d2687ad3a3.pngStep 2 创建表 3a449a8e61cd1b443dbc63d2687ad3a3.png   CREATE TABLE IF NOT EXISTS `loadrecord` (   `uid` int,   `loadtime` string ) ; INSERT INTO `loadrecord` (`uid`, `loadtime`) VALUES   ('201', '2017/1/1'),   ('201', '2017/1/2'),   ('202', '2017/1/2'),   ('202', '2017/1/3'),   ('203', '2017/1/3'),   ('201', '2017/1/4'),   ('202', '2017/1/4'),   ('201', '2017/1/5'),   ('202', '2017/1/5'),   ('201', '2017/1/6'),   ('203', '2017/1/6'),   ('203', '2017/1/7'); 3a449a8e61cd1b443dbc63d2687ad3a3.pngStep 3 添加一列日期序号 3a449a8e61cd1b443dbc63d2687ad3a3.png select uid,loadtime,row_number() over (partition by uid order by loadtime) as row_num from loadrecord; 结果如下图所示: ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ b89e3b5a598928a5d66e6815de6b15b6.png ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ 这里用到了row_number窗口分析函数,将每个用户按照登录日期升序进行编号。 3a449a8e61cd1b443dbc63d2687ad3a3.pngStep 4 获得一个新日期 3a449a8e61cd1b443dbc63d2687ad3a3.png select uid,loadtime,row_number() over (partition by uid order by loadtime) asrow_num,date_sub(regexp_replace(loadtime,'/','-'),row_number() over (partition by uid order by loadtime)) as new_loadtime from loadrecord e018e84a83be47b6dcce4710d0bd4860.png 这里先用字符串函数regexp_replace将日期格式修改为"yyyy-MM-dd"格式,然后用date_sub函数将日期相减。 3a449a8e61cd1b443dbc63d2687ad3a3.pngStep 5 第一次聚合 3a449a8e61cd1b443dbc63d2687ad3a3.png select uid,new_loadtime,count(uid) as new_loadtime_num from (     select uid,loadtime,row_number() over(partition by uid order by loadtime) as row_num,date_sub(regexp_replace(loadtime,'/','-'),row_number() over (partition by uid order by loadtime)) as new_loadtime     from loadrecord ) a group by uid,new_loadtime 214e0a4dbab3c66265803c9cf3d96153.png   这里使用了count聚合函数和子查询操作,通过这一次的聚合统计出每个用户对应的所有连续登录的天数。 3a449a8e61cd1b443dbc63d2687ad3a3.pngStep 6 审题 3a449a8e61cd1b443dbc63d2687ad3a3.png select uid,max(new_loadtime_num) as max_new_loadtime_num from (   select uid,new_loadtime,count(uid) asnew_loadtime_num   from   (     select uid,loadtime,row_number() over(partition by uid order by loadtime) as row_num,date_sub(regexp_replace(loadtime,'/','-'),row_number() over (partition by uid order by loadtime)) as new_loadtime     from loadrecord   ) a   group by uid,new_loadtime ) b group by uid be24be9dc7e87152b3cb1a1d4857d57b.png 这里使用了max聚合函数和子查询操作,通过这一次的聚合统计出每个用户对应的最大的登录时长。   到此,以上为这道SQL题目的完整解答过程,整个过程涉及SQL的基础操作(建表、查询、限定、排序)的同时,也加入了聚合函数、子查询和窗户分析函数相对进阶的操作。 各用户最长的连续登录天数-这样短短的12个字,翻译成SQL语句居然用到了两层嵌套查询、两个聚合操作、一个日期操作和一个窗口分析函数。 其实在数据分析师的日常工作中,比这道SQL题目复杂的需求也是常见的,所以学好SQL对于数据分析师工作的重要性也就不言而喻了吧。   本文的后半部分将用思维导图的方式给初学者总结出一份快速学习SQL的指南,主要是一些常用的知识点,根据二八定律,只需掌握最重要的20%核心知识点,就足以胜任80%的常见工作,这里总结的应该超过了20%,足够用了。

SQL学习指南

3a449a8e61cd1b443dbc63d2687ad3a3.pngStage 1 基础入门 3a449a8e61cd1b443dbc63d2687ad3a3.png 本阶段是基础入门,了解SQL的基本语法,主要涉及表的操作。   72b9475e14791f22095f6bcf5b30773a.png   3a449a8e61cd1b443dbc63d2687ad3a3.pngStape 2 基础查询 3a449a8e61cd1b443dbc63d2687ad3a3.png 查询操作是最常用的最重要的,下图是基础查询用到的列的操作、运算符、结果限定的语法。   19cfe14b5e7f35f618b11d3b69b6177b.png 3a449a8e61cd1b443dbc63d2687ad3a3.pngStape 3 复杂查询 3a449a8e61cd1b443dbc63d2687ad3a3.png 复杂查询包括子查询、关联子查询和视图,这一部分的内容如果掌握了,可以实际工作中的很多问题。   3ad22fe17888c5a481c7b3e0eb25ab15.png   3a449a8e61cd1b443dbc63d2687ad3a3.pngStape 4 数据更新 3a449a8e61cd1b443dbc63d2687ad3a3.png 本阶段学习数据更新的基本操作,包括插入、删除和更新。 dba16614bc3869dec39c8d8c1c156c71.png 3a449a8e61cd1b443dbc63d2687ad3a3.pngStape 5 常用函数 3a449a8e61cd1b443dbc63d2687ad3a3.png 本阶段学习常用函数,此处按照熟悉函数、字符串函数、日期函数、转换函数列举了较常用的函数,不同的数据库对应的函数名称可能会不一样,大家在使用的时候可以查阅相应数据库的函数文档。 77240c1d3cfc3b9aad64570c61f58710.png 3a449a8e61cd1b443dbc63d2687ad3a3.pngStape 6 聚合排序 3a449a8e61cd1b443dbc63d2687ad3a3.png 本阶段学习聚合和排序,主要介绍聚合查询、分组、分组后筛选、分组后排序的语法和注意事项。一般在实际工作中使用的时候,书写顺序是:select->from->where->group by->having->order by,但是实际的执行顺序是:from->where->group by->having->select->order by(选表->筛选记录->分组->分组后筛选->选列->排序)。 fa66393a69f6bb658fd712c9f7e76c0b.png 3a449a8e61cd1b443dbc63d2687ad3a3.pngStape 7 集合操作 3a449a8e61cd1b443dbc63d2687ad3a3.png 本阶段学习集合操作,包括表的加减、表的联结。 实际工作用多表的联结是很常见的,这里的思维导图列出来的知识点相对比较基础,大家可以在此基础上查阅相应的资料进行补充学习。 badb9013e026c2fbf6d8d8f703fa5c81.png SQL的掌握重在实践,多在实际操作中使用,不必死记硬背语法和函数,把它当做一个工具箱,遇到问题的时候打开工具箱取出相应的工具来解决具体的问题,而打开工具箱的方式多种多样-记忆力超群的你各种函数了然于胸、借助平台提示、搜索引擎搜索等等。 ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ 需要完整学习线路和配套课堂笔记的小海牛,请后台直接回复【学习线路、笔记、思维导图】。更多技术干货,请在后台回复【技术论坛】
备注 “ 进群 ” (广告勿扰) 【海牛大数据交流群】 ffeb8f3b06d40f37022ea145905c7dae.png 558ad6b8b4f383db393bee8fab50972e.pngafb025c85854ce35e7d46f6ef7e477fb.pngd2d8dc4de71f90c21ca63e3a015e67c4.png 001a9ec3ce2499d1a3dc69ef8709fda4.png 949566802af99baf889b69407e9f1405.png  要点赞,要在看 ↓↓↓
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值