39

数据分析师之快速掌握 SQL 基础

 5 years ago
source link: https://mp.weixin.qq.com/s/SiBCRQ4eFIt0FT6spd1sHQ?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

点击上方“ 大数据与人工智能 ”,“星标或置顶公众号”

第一时间获取好内容

UzeQjq3.gif

eeeIN3a.jpg!web

作者丨斌迪

这是作者的第 3 篇文章

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

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

一道SQL面试题

这是一道来自百度数据部门的面试题,主要考察row_number的使用。

题目: SQL语句如何查询各用户最长连续登录天数?如图左边是源表User,右边是需要达到的查询结果。

RVz6FnB.jpg!web

JVb6nu3.png!web

Step 1 审题

JVb6nu3.png!web

各用户最长的连续登录天数,先要确定连续登录的数据特征,日期表现为每个用户的后一天和前一天的差值为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分组统计出数量的最大值。 具体流程见下图:

BBZF7vF.jpg!web

JVb6nu3.png!web

Step 2 创建表

JVb6nu3.png!web

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');

JVb6nu3.png!web

Step 3 添加一列日期序号

JVb6nu3.png!web

select uid,loadtime,row_number() over (partition by uid order by loadtime) as row_num

from loadrecord;

结果如下图所示:

JvuYFzF.png!web

这里用到了 row_number窗口分析函数 ,将每个用户按照登录日期升序进行编号。

JVb6nu3.png!web

Step 4 获得一个新日期

JVb6nu3.png!web

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

77R7zqR.jpg!web

这里先用字符串函数regexp_replace将日期格式修改为"yyyy-MM-dd"格式,然后用date_sub函数将日期相减。

JVb6nu3.png!web

Step 5 第一次聚合

JVb6nu3.png!web

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

YfAZJvZ.png!web

这里使用了count聚合函数和子查询操作,通过这一次的聚合统计出每个用户对应的所有连续登录的天数。

JVb6nu3.png!web

Step 6 审题

JVb6nu3.png!web

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

7JZvYzQ.png!web

这里使用了max聚合函数和子查询操作,通过这一次的聚合统计出每个用户对应的最大的登录时长。

到此,以上为这道SQL题目的完整解答过程, 整个过程涉及SQL的基础操作(建表、查询、限定、排序)的同时,也加入了聚合函数、子查询和窗户分析函数相对进阶的操作。

各用户最长的连续登录天数-这样短短的12个字,翻译成SQL语句居然用到了两层嵌套查询、两个聚合操作、一个日期操作和一个窗口分析函数。 其实在数据分析师的日常工作中,比这道SQL题目复杂的需求也是常见的,所以学好SQL对于数据分析师工作的重要性也就不言而喻了吧。

本文的后半部分将用思维导图的方式给初学者总结出一份快速学习SQL的指南,主要是一些常用的知识点,根据二八定律,只需掌握最重要的20%核心知识点,就足以胜任80%的常见工作,这里总结的应该超过了20%,足够用了。

SQL学习指南

JVb6nu3.png!web

Stage 1 基础入门

JVb6nu3.png!web

本阶段是基础入门,了解SQL的基本语法,主要涉及表的操作。

jEjAbaa.jpg!web

JVb6nu3.png!web

Stape 2 基础查询

JVb6nu3.png!web

查询操作是最常用的最重要的,下图是基础查询用到的列的操作、运算符、结果限定的语法。

A3MbA3M.jpg!web

JVb6nu3.png!web

Stape 3 复杂查询

JVb6nu3.png!web

复杂查询包括子查询、关联子查询和视图,这一部分的内容如果掌握了,可以实际工作中的很多问题。

jaaIVn6.jpg!web

JVb6nu3.png!web

Stape 4 数据更新

JVb6nu3.png!web

本阶段学习数据更新的基本操作,包括插入、删除和更新。

ZfiiQjZ.jpg!web

JVb6nu3.png!web

Stape 5 常用函数

JVb6nu3.png!web

本阶段学习常用函数,此处按照熟悉函数、字符串函数、日期函数、转换函数列举了较常用的函数,不同的数据库对应的函数名称可能会不一样,大家在使用的时候可以查阅相应数据库的函数文档。

IVBreuI.jpg!web

JVb6nu3.png!web

Stape 6 聚合排序

JVb6nu3.png!web

本阶段学习聚合和排序,主要介绍聚合查询、分组、分组后筛选、分居后排序的语法和注意事项。 一般在实际工作中使用的时候,书写顺序是: select->from->where->group by->having->order by,但是实际的执行顺序是: from->where->group by->having->select->order by(选表->筛选记录->分组->分组后筛选->选列->排序)。

UrQZvuz.jpg!web

JVb6nu3.png!web

Stape 7 集合操作

JVb6nu3.png!web

本阶段学习集合操作,包括表的加减、表的联结。 实际工作用多表的联结是很常见的,这里的思维导图列出来的知识点相对比较基础,大家可以在此基础上查阅相应的资料进行补充学习。

mMFnMrZ.jpg!web

SQL的掌握重在实践,多在实际操作中使用,不必死记硬背语法和函数,把它当做一个工具箱,遇到问题的时候打开工具箱取出相应的工具来解决具体的问题,而打开工具箱的方式多种多样-记忆力超群的你各种函数了然于胸、借助平台提示、搜索引擎搜索等等。

最后,福利 送书 环节。

关注公众号,后台回复“SQL入门书籍”,可以领取《SQL基础教程(第2版)》高清完整电子版书籍-非拍照版,本篇文章的大部分的知识点都是来自这本书。

-end- 

Mbm2qeq.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK