1 写在前面
在写本文之前,我需要跟大家探讨以下几个话题。
# 你为什么必须学SQL?
其实这个问题理解起来也不是那么困难,在我们工作中,无论是业务人员,还是开发人员,或是管理者,如今,几乎每个人都必须使用某种形式的数据,因为数据毕竟是信息的呈现,要获取信息必须得依赖数据,而这些数据通常是以电子表格或是数据库的形式存放。
现状1:从业务人员视角来看
在企业里面,我们当前的现状就是,业务人员想要看哪些数据得依赖开发人员从数据库中提取数据,而这一过程需要漫长的等待,影响工作效率,如果我们懂简单的SQL,自己能从数据库提取数据,那么工作效率就会有大的提升,在同样的岗位中能够脱颖而出
现状2:从数据分析师视角来看
学习SQL几乎成为数分必备的技能,如果这个技能不达标,基本上很难通过面试,而且近几年SQL面试的题目也越来越难,要想通过面试几乎成为数据分析师必须且深度掌握的技能。
现状3:从数据开发者角度来看
对于数据开发者来讲,典型的像数仓同学,基本天天与SQL打交道,这里其实与数据分析岗位有交叉的部分,对于SQL的掌握不言而喻。
# SQL语法很简单,但几乎没几个人写的很好
这里不得不提国内语言的鄙视链,在大多数程序员眼里,他们认为SQL称不上一门语言,因为门槛太低,语法很简单就几个命令就能搞定,不需要专门学,或是成为一种岗位。有这种认识的往往都不是从事数据相关的人员,他们实际工作中使用SQL语言也很简单,就是简单的增删改查,甚至有时候面试问他们分组TOPN的问题都会难倒一大片,而对从事数据开发或数据分析师来讲,分组TOPN问题却很简单,这就是平时工作方向的不同带来的误区。不同的岗位有不同的工作方向和重点,我们不能以语言简单程度来区分岗位的优劣,或有鄙视心里,因为毕竟语言只是一种工具,而程序员最重要的还是逻辑思维能力,如果我拿语法比较简单的语言比如SQL去处理复杂的业务逻辑,其实未必就是一件简单的事情,他背后需要的是数据处理的逻辑思维及业务知识,其实此时SQL仅仅只是个工具。
在国外Data Science面试中,对SQL的考察,其实要求很高,很多公司要求必须熟练掌握SQL相关基础语法,并具备极强的数据处理思维逻辑,很多面试者也在SQL考察环节栽了跟头。在众多求职者中,我们分析其原因,这些求职者并不是不懂SQL语法,而是缺乏数据分析的思维能力,缺乏必要的实战技巧。甚至我们经常跟很多经验丰富数仓开发同学去聊,他们在用SQL解决实际业务问题时,都是这样的处理逻辑,遇到要分析的指标,先分析指标的含义,搞清楚逻辑及需要取数的源表后,就开始像套公式般找各种内置的函数去套,看看哪种函数能帮我解决业务问题,像极了某些语言开发者去寻找API的过程。但作为成熟的开发者来说,我们在处理数据问题或写代码时是这样吗?这里我们先打个问号,留给读者自己体会。倘若我们的业务逻辑稍微复杂些,套用函数或API套不动了怎么办?业务不做了吗?去跟业务撕逼吗?哈哈,我想办法总比困难多。这也就是我们所说的工作了好多年,你发现没几个人会把SQL写的很好,吹牛逼的时候人人都觉得自己是SQL King或SQL Queen,但实际上呢?遇到复杂的业务逻辑或面试题也会凉凉。。。。。。当然实在不行了,我们也可以换语言实现嘛,总之办法总比困难多。最后,对于一个成熟的Sqler,不仅仅只是停留在实现业务逻辑的角度,更重要的一点还要从底层执行引擎的角度去理解SQL执行过程,看懂执行计划,并能写出性能较高的SQL。
讲到这里,我相信对于一些读者或许有一些感触,也许对于正在学习SQL、准备数据开发、数据分析求职面试的同学也正经历着一些困扰。怎么SQL一看就会,一做就废?明明我平时做了很多大量的SQL题,牛客也做了,力扣也刷了,可是到了面试环节,面试官提出的问题怎么就不会了呢?或是到了一家新公司,明明我平时都是在写SQL的呀,到了这家公司我怎么看不懂SQL了呢?我相信不少同学有类似这样的疑问?本质原因还是平时学习或工作总结的太少,缺少SQL实战技巧的总结,没有形成理论化、体系化的东西,知识也只是稀散的,因此在遇到问题时很难快速的找到突破口并及时应对。
基于此,我给大家总结了一份SQL实战技巧,这些技巧和理论也是从平时的业务开发中总结出来的,从实战中来再到实战中去,反复琢磨,打造而成。也希望大家平时在学习中能有所收获,最后也能看到你嘴角上扬的微笑,其实SQL也可以这么简单。
2 SQL实战技巧总结
2.1 断点问题
2.11 断点分组
SQL进阶技巧:车辆班次问题分析
SQL 进阶技巧:断点重分组应用求连续段的最后一个数及每段的个数【拼多多面试题】
SQL进阶技巧-:字符串时间序列分析法应用之用户连续签到天数及历史最大连续签到天数问题【腾讯面试题】
SQL进阶技巧:断点重分组算法应用之用户订单日期间隔异常问题分析
SQL进阶技巧:如何对连续多条记录进行合并?【GroingIO 面试题】
SQL进阶技巧:断点重分组算法应用之相邻时间间隔跳变问题分析
SQL进阶技巧:断点重分组算法应用断电次数及断电时长统计
SQL进阶技巧:断点分组算法实践与应用
SQL进阶技巧:间隔连续问题【断点分组思想】
SQL进阶技巧:通过断点重分组算法解决事件类型问题思路-CSDN博客
2.22 断点排序
SQL进阶技巧:断点分组算法应用之断点排序问题
2.23 断点缝合
SQL进阶技巧:断点缝合问题【如何按照业务规则对相邻行数据进行合并】-CSDN博客
2.24 断点边界划分
2.25 断点去重
SQL进阶技巧:断点缝合问题【如何按照业务规则对相邻行数据进行合并】-CSDN博客
2.3 数据分桶问题
2.2.1 基于规则的分桶
2.3.2 等距分桶
SQL进阶技巧:如何按照固定尺寸(固定区间)对数据进行打分类标签?
SQL进阶技巧:动态分桶算法应用之用户观看时长问题分析
SQL进阶技巧:如何按照区间或时段对数据进行动态分桶?
2.3.3 等频分桶
SQL进阶技巧-动态分桶算法应用之数据前后百分比问题
SQL进阶技巧:如何按照某个字段对数据进行动态分桶?
2.3 数据合并问题
SQL进阶技巧:如何保证collect_list()函数有序性?【有序数据合并问题】-CSDN博客
2.3.1 基于指定规则的数据合并
SQL进阶技巧:有序数据合并问题之如何按照指定的规则对数据进行合并?【详解collect_list函数有序性保证】
SQL进阶技巧:如何按照指定顺序将多行转一列
2.3.2 基于时间顺序的数据合并
SQL进阶技巧:有序数据合并问题之如何按照时间顺序对数据进行合并?【腾讯互娱-分析某用户玩游戏的先后顺序链条】
SQL进阶技巧:如何将固定尺寸字符串标签数据按顺序展开
SQL进阶技巧:如何保证collect_list()函数有序性?【有序数据合并问题】-CSDN博客
2.4 数据展开问题
SQL进阶技巧:如何进行数据扩充?
SQL进阶技巧:如何使用HQL遍历字符串?
Sql进阶技巧:如何进行多容器的数据扩展
Sql进阶技巧:如何遍历字符串及获取字符串对应索引位置 SQL高级技巧:如何进行字符串收缩变换【京东面试题】Sql进阶技巧:如何遍历字符串及获取字符串对应索引位置
2.5 时点值状态问题(拉链表计算)
SQL高级进阶技巧:利用累加思想解决同时在线人数问题
SQL进阶技巧:如何对拉链表进行统计分析?【部门人员在职情况统计分析&&三一重工】
SQL高阶技巧:如何统计当前时间点状态情况【辅助变量+累计变换思路】
数据分析及应用:快手直播间人员在线分析-CSDN博客
2.6 和差计算的递归问题
SQL进阶技巧:Hive如何巧解和差计算的递归问题?【应用1】
SQL进阶技巧:Hive如何巧解和差计算的递归问题?【应用案例2】
2.7 集合(容器)问题
SQL进阶技巧:如何对多个字段中字符串内容进行一一对应?
SQL进阶技巧:如何统计数组中非0元素的个数
2.8 稀疏字段问题
SQL进阶技巧:如何将同一组内稀疏字段用有值的数据填充完整【数据清洗技巧】?
Sql进阶技巧:如何获取稀疏表字段中最新的值所对应的其他字段值
Sql进阶技巧:稀疏字段累计求和问题
Sql进阶技巧:如何利用距离最近的一条记录补全空值【稀疏表补全法】
2.9 连续性问题
SQL进阶技巧:如何计算连续增长问题?
经典连续性问题:数学思维在SQL编程中的应用
SQL高阶技巧:一种通用的连续性问题处理方法
2.10 区间重叠问题
SQL进阶技巧:如何计算重叠区间合并问题?
SQL进阶技巧:重叠区间问题分析之品怕打折日期问题
2.11 非连续日期的累计计算问题
SQL高级技巧:如何精准计算非连续日期累计值【闪电快车面试题】-CSDN博客
2.12 自关联问题
2.12.1 可能好友
2.12.2 共同好友
SQL进阶技巧:如何分析每个用户的受欢迎程度【Facebook面试题】
SQL进阶技巧:如何分析共同好友问题
2.12.3 IP检测问题
SQL进阶技巧:自关联问题 之如何分析共同使用ip用户检测问题【拼多多面试题】
2.12.4 推荐好友问题
SQL进阶技巧: 向用户推荐好友喜欢的音乐【腾讯】
2.13 TopN问题
SQL进阶技巧:TopN问题之英雄出场排名、出场次数及出场率问题分析
SQL进阶技巧:TopN问题如何求第二高薪水?
SQL进阶技巧:TopN问题之取出累计值与1000相差最小差值的id【滴滴面试】
SQL 进阶技巧:TopN问题之不及格课程数大于2的学生的平均成绩及其排名【拼多多】
SQL进阶技巧:TopN问题之计算每一年出现过的最大气温值
SQL进阶技巧:TopN问题分析如何获取积分最多的人?
2.14 先进先出账龄问题
SQL进阶技巧:如何计算先进先出库龄问题?
2.15 缺失值填充问题
Sql进阶技巧:数据清洗如何分析商品入库采购成本数据缺失问题?【京东面试题】
Sql进阶技巧:如何利用距离最近的一条记录补全空值【稀疏表补全法】
SQL进阶技巧:数据清洗如何利用组内最近不为空的数据填充缺失值。【埋点日志事件缺失值填充】-CSDN博客
SQL进阶技巧:最近有效的缺失值填充问题【last_value实现版】-CSDN博客
2.16 存在计数问题
SQL进阶技巧:存在性问题分析?
SQL进阶技巧:如何将同一组内稀疏字段用有值的数据填充完整【数据清洗技巧】?
2.17 截断平均值问题
Sql进阶技巧:如何分析去掉最大最小值的平均薪水【字节跳动】
彻底理解冷门函数PERCENT_RANK()函数?如何利用其特性巧解实际问题?_hive percent rank-CSDN博客
2.18 中位值计算问题
SQL高阶技巧:一种中位数的分析技巧及思路
2.19 波峰波谷问题
SQL进阶技巧:如何求波峰和波谷?
2.20 至多至少问题
2.21 动态行转列问题
SQL进阶技巧:如何不使用union all 进行行转列
SQL进阶技巧:如何不使用union all进行行转列?【三种方法实现】-CSDN博客
SQL进阶技巧:如何利用Stack()函数进行转列及动态行转列技巧?-CSDN博客
2.22 累计去重问题
Sql进阶技巧:多指标累计去重问题
2.23 近N指标问题
SQL高级技巧:如何准确求近30天指标?
2.24 多维分析
Sql高级技巧:高阶多维聚合函数应用
SQL进阶技巧:多维分析之如何还原任意维度组合下的维度列簇名称?【利用grouping_id逆向分析】-CSDN博客
未完,持续更新中
注意:点赞关注加收藏,本篇文章将会持续更新,目前只是整理了部分内容,本文所有的内容都放在数字化建设通关指南中,后续内容敬请期待~~
版权归原作者 莫叫石榴姐 所有, 如有侵权,请联系我们删除。