热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

第一时间获取好内容

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

第一时间获取好内容

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

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

作者丨斌迪

这是作者的第 3 篇文章

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

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

一道SQL面试题

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

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

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

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

Step 1 审题

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

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

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

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

Step 2 创建表

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

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

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

Step 3 添加一列日期序号

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

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

from loadrecord;

结果如下图所示:

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

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

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

Step 4 获得一个新日期

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

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

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

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

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

Step 5 第一次聚合

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

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

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

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

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

Step 6 审题

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

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

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

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

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

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

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

SQL学习指南

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

Stage 1 基础入门

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

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

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

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

Stape 2 基础查询

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

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

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

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

Stape 3 复杂查询

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

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

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

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

Stape 4 数据更新

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

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

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

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

Stape 5 常用函数

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

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

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

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

Stape 6 聚合排序

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

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

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

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

Stape 7 集合操作

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

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

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

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

最后,福利 送书 环节。

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

-end- 

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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 我们


推荐阅读
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
author-avatar
michaelma423
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有