四条SQL准则:提升你的数据科学技能
毫无疑问,具备编写SQL的能力是在任何数据科学领域获得成功的必要条件。目前没有任何证据表明这种情况会发生变化,所以,掌握SQL技能是一项非常值得的投资。
无论你是想找数据科学领域的第一份工作,还是要在下一轮就业市场中提高自己的SQL技能,或者是想要提高自己的职业水平,以下有四个原则,可以帮助你在这些方面取得成功。如果你想了解更多数据分析相关内容,可以阅读以下这些文章:
SQL查询语句应该避免的五个错误
初学数据科学常犯的三个SQL错误
如何在Pandas里写SQL查询语句?
数据科学家面试必须掌握的十个SQL概念
那我们直接开始吧。
01 确定正确的粒度(the Right Grain)
这里提到的“粒度(Grain)”是什么意思呢?
SQL查询的粒度,其实就是你想要输出的数据集的聚合级别。
假如你正在找一个汇总日常用户操作的数据集,那么你的“粒度(Grain)”就可以描述为“用户日级别(the user-day level)”(即,每一行代表每个用户每天执行一次操作)。
提前考虑到这点是很好的,主要有以下两个原因:
首先,它能帮助你规划你的查询结构。
当你步入数据科学工作市场时,这一点就显得尤为重要。因为在此过程中,通常要求应聘者对SQL进行实时编写。所以,在开始查询之前构造一个思想框架,能够帮助你更清晰、有效地找到答案,进而给面试官留下深刻的印象。
其次,它能帮助你识别到代码中的错误。
通常,你会对自己编写的sql查询的返回行数有一定的了解。比如,假设我计划的粒度在“用户”级别,而且我还知道我们有大约1,000个用户。当我的查询返回结果中有一个100,000行的数据集时,我就能立刻知道查询中存在一个或多个join的问题。
02 格式很重要
SQL是一种语言,所以我们用SQL建立的查询就是在讲述一个故事。我们要把它写成在未来,自己和同事们都可以轻松阅读的故事。一些快速检查的查询是不需要太在意格式的,但是任何有可能被其他人或者将来的自己读到的查询,都应遵循统一的格式。下面是一个简单但格式很好的查询例子。
以下是一些我深思熟虑后选择的格式:
- 所有关键字都大写(CAPS)
- 新行上的关键字全部右对齐,后续的表达左对齐
- 每个表格都有一个简单又有意义的别名
- 在GROUP BY和ORDER BY子句中使用那个列的数。
我知道有些人会觉得这很“偷懒”,但不得不说,这会节约很多成本,速度很快,而且还可以通过列的别名进行干净的group by。比如,如果我想在GROUP BY子句中使用列名,就必须执行以下操作(大部分情况下这是正确的,某些数据库在GROUP BY中允许使用别名)。
关于SQL格式的观点有很多,但我认为不一定非要分出胜负。你只需要选择其中一个,然后保持一致即可。
03 使用CTE,而不是子查询(Subquery)
公用表表达式(CTE或Common Table Expressions)是一个临时的数据集,可以在后续的查询中的SQL语句中引用。让我用一个例子来说明CTE,下面的查询找到了从第一笔订单到100,000美元的订单发展最快的销售代表。
让我们来分解一下这个查询的各个部分:
- 首先,你会注意到关键字WITH。使用CTE的所有查询必须在第一个CTE之前包含这个语句。
- first_order_day是我们的第一个CTE。它定义了一个数据集,用于查找销售代表完成订单的第一天。First_order_day还可以在后续表达式中被引用,就像在数据库中引用任何其他表格一样。
- 接下来,我们来定义另一个CTE,running_order_value。它可以用来计算每个销售代表的连续销售总额。
- 最后,我们用两个CTE来返回对应最短time_to_goal的行。
用子查询编写的查询还可以用CTE写,我更建议你这样做,因为这对你的同事还有未来的自己而言,既简洁明了又很容易遵循。而且,我们还可以使用子查询来查看上面的查询。这听起来很颠覆之前的认知,对吧?
总之,通过CTE,在达到相同结果下,还能够提高整体的可读性与逻辑流程。
04 用代码的注释讲故事
虽然说,SQL现在也被看做软件工程中的一种编程语言,但它为什么不像其他语言(比如python)那样,按照标准做法去注释呢?我认为,这很大程度上取决于人们学习SQL的方式。虽然在软件工程中,大多数编程语言在教学过程都会强调这个做法,但在教SQL时,往往是事后才会想到的格式。因为,通常我们只把它当作达到目的的一种手段(即数据集→分析)。
但是,我们在SQL查询分析中做出的一些关键的决定,都取决于我们自己、我们的利益相关者、以及那些审看我们代码(通过注释理解我们意图)的人。
特别是在更为复杂的查询中,注释对于透彻的分析非常有用。
在未来,注释也可以帮助你和查看你代码的人了解你的原始意图。
这大大节省了我们自己和同事重新阅读、审查代码的时间。当我们生成一个用来分析的数据集时,数据科学家会在脑海中确立一个最终目标(比如,我们想看到过去6个月登录的用户访问帮助页面的次数)。记录我们的查询意图,都有助于指导我们编写查询,并帮助审核员判断工作的准确性。
注释能记录相关的数据假设
垃圾进,垃圾出(GIGO:Garbage in Garbage Out)是我们分析时应该优先注意的。简而言之就是,如果你输入了一个无意义的分析或模型数据,你会得到无意义的结果。
这很重要,因为原始数据在被用于分析之前需要建模和聚合。在某些程度上,这也会发生在SQL中(尤其是随着dbt等工具的出现)。所以,当你对你的数据做出假设,或者选择某种类型的集合(例如使用中位数vs.平均值)时,你要在代码的注释中解释你为什么要这样做。如果无法向同事或利益相关者解释,为什么你在查询中包含某个表达式的话,会非常糟糕。
一切源于信任
其实,这四个原则都是基于信任的,而信任是数据科学家拥有的最重要的资产。学习或编写SQL时,遵循这四个原则可以帮助你建立你在面试官、同事和利益相关者中的信任。
感谢你的阅读!你还可以订阅我们的YouTube频道,观看大量数据科学相关公开课:https://www.youtube.com/channel/UCa8NLpvi70mHVsW4J_x9OeQ;在LinkedIn上关注我们,扩展你的人际网络!https://www.linkedin.com/company/dataapplab/
原文作者:Nate Coleman
翻译作者:Lea
美工编辑:过儿
校对审稿:Jiawei Tong
原文链接:https://towardsdatascience.com/4-principles-to-learn-sql-for-data-science-781520c0e983