sql groupby 后再join_不要再犯SQL的这些常见错误了!

83f132daa5963e8322ab82e0e6381d96.png

SQL上手特别简单,在所有语言里算是简单的一种,甚至很多人不认为它算得上编程语言。但是,不要被SQL的简单外表迷惑了,如果我们问自己:多少次我尝试从大数据抓取数据,但是获得了不完整或者错误的数据?答案是:太多次了,连自己都数不清!

而正是因为SQL代码不轻易报错(通常只要语法正确,都会返回一些数据,但未必是你本来想要的),我们反而需要花更多的精力去校对,确保数据的准确性。

以下,我们总结了最关键的5个SQL常见错误,以儆效尤:

1. Queries语句的执行顺序

d18a073f8956cf19eaa219ded1c2da8d.png SQL的入门门槛很低。很多人认为会使用Join, Group By 语句就可以自诩专家了。但是“砖家”们真的知道SQL语句的执行顺序吗? SQL查询不是以SELECT开始的,虽然我们编写代码时,它们在编辑器中是从Select开始编写的,但是实际执行却并不是从SELECT开始的。 数据库首先使用FROM和JOIN执行查询,这就是为什么我们可以在WHERE中使用合并表中的值。 为什么我们不能在WHERE语句中筛选分组(GROUP BY) 的结果?因为GROUP BY在WHERE之后才会被执行。因此,我们需要通过HAVING进行更进一步的条件筛选。 常规情况下,SELECT是最后执行语句。它决定了查询结果需要输出哪些列,并进行何种聚合运算。此外,WINDOW FUNCTION 在这一步被执行。 这就是为什么当我们尝试在WHERE中筛选WINDOW FUNCTION的结果时会出现错误。 注意:数据库使用查询优化器来优化查询语句执行。优化器可能会更改某些操作的顺序,以便查询运行得更快。以上的介绍是正对常见情况下,对SQL执行幕后所发生事情的笼统的概述。

2. WINDOW FUNCTION 是做什么的?

8cebccfcc380a9658a72944c203c0294.png 很多人第一次遇到WINDOW FUNCTION时都觉得它似乎很神秘。为什么使用Window function作为分组可以聚合数据? Window Function (WF) 通过特定语句简化了许多操作步骤以方便语句运行:
  • WF允许直接访问当前记录前后的数据。参见LEAD和LAG函数。

  • WF可以使用GROUP BY对已经聚合的数据执行额外的聚合。见上图中的示例:使用WF计算移动累计销售额。

  • ROW_NUMBER 可以遍历每一行。还可以用来删除重复的记录。或者取一个随机样本。

  • 顾名思义,WF可以计算给定窗口的统计信息:

c4ee6e03f044b4c337248f1f529f357e.png 上面的WF计算的就是从第一个记录到当前记录的累计总和。 Window Function值得你去专门花时间学习一下基本原理,不然很可能会把查询语句写得过于复杂以至于程序报错。

3. 利用CASE WHEN 计算平均值

61319f90f877f2ff91e9efc568ae9f78.png CASE WHEN类似于编程语言中的IF条件语句。当我们需要对数据的某个子集计算统计信息时,它的作用就显现出来了。 上面的代码计算了在美国销售的产品的平均价格,但是这段代码有一点小问题,也就是对于Else的编写是有问题的。 在第一个个语句中,这段代码将所有非美国产品价格设为0,这降低了总体平均价格。如果有很多非美国产品,平均价格可能接近于0。 3e846d08585793cafad10e459078cbce.png 在第二个例子中,它只计算了在美国销售的产品的平均价格,这才是我需要的结果。请注意在这里使用CASE时不需要包括ELSE,因为它默认为NULL。 b9135184b8f4672fcd557041d71d582f.png 请注意在使用CASE语句时,一定要小心使用“else 0”。它对SUM没有任何影响,但是会对AVG平均计算产生巨大影响。

4. 对存在缺失值的列执行JOIN语句

6c3d3d7c94e0c04cb180eeb6d7110bed.png SQL中有4种不同的JOIN: Inner, Outer, Left和Right。当我们在查询中使用JOIN时,它默认为INNER JOIN。 虽然我对JOIN有一些研究学习,但是我还是会犯一些小错误。 如上图所示执行JOIN语句,结果显示许多记录都丢失了。为什么会这样?明明是很简单的JOIN语句。 真是的原因其实是表1和表2中string_field列存在许多NULL值。通常人们会认为JOIN会保留NULL的记录因为NULL等于NULL,难道不是吗? 然后我运行如下语句: 0e89ee21ac7a13ad9f416e5c6ac314ba.png 结果返回的是NULL。 对于这种情况,为了不丢失有NULL的记录,解决方法应该是利用COALESCE,将string_field中的NULL转换为空字符串。 c56010076322d964a9bec3e7101f0a01.png 但需要注意的是,这样做会将表1中每个包含NULL的记录与表2中每个包含NULL的记录全部匹配起来。 通过使用ROW_NUMBER() 的 WINDOW FUNCTION,我们可以移除这些重复的匹配:
  • 假设该数据表对每一行都有唯一的标识符“某某某ID”和一个时间戳字段。

  • 只需保留每个标识符的第一行,这样就可以删除重复项。

efdc5689edc20ef3f708042b7bc5a2bd.png

5. 对于复杂的查询语句不会使用临时表

befdb124e0a94e31883b605e33cfe18d.png SQL另外一大优点就是能够调试纠错。 我们可以拆分复杂的查询语句并创建多个临时表。然后可以对这些表运行“完整性检查”,以确保它们包含正确的记录。在设计一个全新且重要的查询或报告时,强烈推荐使用这种方法。 e18406f71fbeb7cd1bfc9d48de214373.png 临时表的唯一缺点是数据库中的查询优化器无法优化该查询。 当需要保证执行效率时,可以将创建临时表的语句用with语句重新定义、查询。 91366733c5566320225dbb5628074e08.png 读了这篇文章,是不是更了解SQL了呢?SQL和Python看似门槛不高,但想要熟练掌握解决各种复杂的问题,顺利应对 数据科学面试中多种多样的情况并不容易。MarTechApe的 《A/B测试企业级实战训练营》 以真实商业场景中的复杂A/B测试问题为项目背景,让学员在两个月的时间里,使用百万量级原始数据,利用SQL与Python搭建完整的A/B测试流程!

在过去开办的四期《训练营》中,我们为顶尖科技公司输送数据能力强、实验经验丰富、统计基础扎实的数据人才。不论你本来是什么背景,都能通过这门课程,打开盛行“测试文化”的互联网高科技公司的大门!

以下为往期学员的战绩榜:

d36a43c30fc91130bcae2282db1a218a.png现在,MarTechApe《A/B测试企业级实战训练营》 第5期正在火热报名中!
每一期训练营,我们只招收20名学生。先到先得,遵循阶梯价位,优惠逐额递减,越早报名越优惠!? 点击下面的图片,了解课程详情!? b6d2ead2828aecbfd6abe93103ea9e7e.png
5ce40e857cb92c883692cc548d469a78.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值