与21世纪的数据相关的所有事物都已变得至关重要。对于任何数据科学有志者来说,关键技能之一就是掌握SQL函数,以进行有效而高效的数据检索。SQL被广泛用于直接从数据库查询,因此,SQL是用于数据分析任务的最常用语言之一。但是它有其自身的复杂性和细微差别。
当涉及到SQL函数时,它们有很多。您需要在正确的时间了解正确的功能,以实现所需的功能。但是,包括我在内的我们大多数人都有跳过这个话题或将其悬而未决的趋势。相信我,在学习过程中保持这些话题不变是一个愚蠢的错误。
因此,在本文中,我将带您了解一些您必须定期用于数据分析任务的最常见的SQL函数。
数据集简介
我将通过使用虚拟数据集向您展示本文涵盖的所有功能的实际应用。假设全国各地都有零售连锁店。以下SQL表记录了从零售店购买商品的人,购买商品的日期,所来自的城市以及购买金额。
我们将使用此示例,在本文中学习不同的功能。
汇总功能
- 计数最重要的聚合函数之一是count()函数。它从表中的列返回记录数。在我们的表格中,我们可以使用count()函数获取订单来自的城市数。我们这样做如下:
-
- 您会在这里注意到两件事。首先,Null函数对空值进行计数。然后,重复值被多次计数。为了解决这个问题,我们可以将其与distinct()函数配对,该函数将仅计算该列中的不同值。
- 和每当我们处理与数字有关的列时,我们必然要检查它们的总和。例如,在我们的表中,金额的总和对于分析已发生的销售很重要。可以使用对列名称起作用的sum()函数来计算总和。
- 但是,如果我们想要计算总金额为每一个城市?为此,我们可以将此功能与Groupby子句结合使用,以按城市对输出进行分组。这是您如何实现的。
- 这向我们表明,该公司将Indore视为我们收入最高的城市。
- 平均过去曾做过一些数据分析的任何人都知道,平均值是比仅计算数值总和更好的度量标准。在我们的示例中,我们有来自同一城市的多个订单,因此,计算平均金额而不是总金额会更加谨慎
-
- 最小和最大最后,如果不计算最小值和最大值,汇总值分析将无法完成。可以使用min()和max()函数简单地计算这些值。
-
数学函数
大多数时候,您将不得不处理SQL表中的数字以进行数据分析。要处理这些数字,您需要数学函数。这些可能有一个简单的定义,但在分析时,它们是使用最多的函数。
- 腹肌abs()是最常见的数学函数。它计算作为参数传递的数值的绝对值。为了了解在哪里有帮助,让我们首先从表中找出每个记录的金额与平均金额的偏差。
-
- 现在,如您所见,这里有一些负值。可以使用abs()函数将其轻松转换为正值,如下所示:
-
- 天花板和地板处理数字值时,其中一些可能具有十进制值。你如何处理这些?您可以简单地将它们转换为使用ceil()的下一个较高的整数,或者使用floor()转换为上一个较低的整数。在我们的表格中,“ 金额”列有很多十进制值。我们可以使用ceil()或floor()函数将它们转换为整数。
-
- 截短有时您不希望将十进制值转换为整数,而是截断数字中的小数位数。Truncate()函数实现了它。您要做的就是将十进制数作为第一个参数,并将要截断的位数作为第二个参数。
- 如您所见,我将值截断到小数点后一位。
- 模数模函数是强大而重要的功能。当第二个数字除以第一个数字时,Modulo返回剩余的余数。通过调用函数mod(x,y)来使用它,其中的结果是x除以y时剩下的余数。它在分析中具有非常重要的作用。您可以使用它从SQL表中查找奇数或偶数记录。例如,在示例表中,我可以使用模函数来查找数量奇数的那些记录。
-
- 或者,如果使用not关键字否定上述结果,我甚至可以找到数量。
字符串函数
当您使用SQL表时,您将始终需要处理字符串。当您想以一种合理的方式输出结果时,它们尤其重要。
- 上下限您可以分别使用upper()或lower()函数将字符串值转换为大写或小写。简而言之,这有助于使记录值更加一致。
- 康卡特concat()函数将两个或多个字符串合并为一个。您要做的就是将要连接的字符串作为参数提供。
- 就像您已经注意到的那样,即使其中一个值是Null,整个输出也会作为Null值返回。
- 修剪Trim是一个非常重要的功能,不仅在SQL中,而且在任何语言中都有。它是最重要的字符串函数之一。它从字符串中删除任何前导或尾随空格。例如,在我们的示例表中,“ 姓氏”列中有许多尾随和前导空格。我们可以使用trim()函数删除它们。
-
- 如您所见,该函数已经修剪了字符串中的任何前导或尾随空格。
日期和时间功能
首先,毫无疑问,日期和时间功能的相关性。但这只有在您知道如何妥善处理它们的情况下!查看以下日期和时间功能,以掌握您的分析技能。
- 日期和时间如果您像示例表中一样具有日期和时间的公共列,那么您将需要使用date()和time()函数来提取相应的值。
- 提取但是有时您可能想更进一步,分析在一周或一个月的特定日期或一天中的特定时间下达了多少订单。为此,您需要使用超级方便的extract()函数。语法是简单的:提取物(单元/日期)单位可以是年,月,分钟或秒。
- 您甚至可以提取一年中的一周或一年中的某个季度。
-
- 您可以从日期中提取的所有单位的完整列表如下:
-
- 如您所见,您可以使用extract()函数进行很多分析!
- 日期格式有时,数据库中的日期将以与您希望查看的日期不同的格式保存。因此,要更改日期格式,可以使用date_format()函数。语法如下:date_format(date,format)当前,样本表中保存的日期采用年-月-日格式。使用此功能,我将以日-月名称-年份格式输出日期。
-
- 根据您的要求,有很多机会可以更改格式。
窗口函数是重要的函数,但要理解它可能有些棘手。因此,我们首先从了解基本窗口功能开始。
视窗功能
窗口函数执行的计算类似于聚合函数,但略有扭曲。虽然常规聚合函数将行分组为一个输出值,但window函数却不这样做。窗口函数可用于行的子集,但不会减少行数。这些保留其各自的身份。为了更好地理解它,让我们比较一个简单的聚合函数sum()。
在这里,我们获得所有行的合计值。现在让我们将Windows函数用于此聚合函数,看看会发生什么。
您一定已经注意到,我们仍然会获得汇总总和值,但它们是由不同的城市组分开的。注意,我们计算每一行的输出。
该OVER 子句将简单集合函数到Windows功能。语法很简单,如下所示:
window_function_name(< expression>)OVER(< partition_clause> < order_clause>)
OVER子句之前的部分是聚合函数或Windows函数。在接下来的部分中,我们将介绍一些窗口功能。
OVER子句之后的部分可以分为两部分:
- Partition_clause定义行之间的分区。窗口功能在每个分区内运行。在通过分区子句定义它。
- Order_clause对分区中的行进行排序。在按订单子句定义它。
在后面的部分中,我们将在其他一些窗口功能中进行详细介绍。
简单的窗口函数是rank()函数。顾名思义,它基于条件对分区组中的行进行排名。
它具有以下语法:Rank()Over(按<expression>分区按<expression>排序)
让我们使用此函数根据每个城市内的订单量对表中的行进行排名。
因此,这些行已在其各自的分区组(或city)内排名。
这是一个重要的窗口函数,可找到组中行的相对排名。它确定每一行的百分位数值。
其语法如下:Percent_rank()Over(按<expression>进行分区按<expression>进行排序)
尽管partition子句是可选的。
让我们使用此功能来确定表中每个客户的金额百分比。
有时您想找出哪一行具有最高,最低或第n个最高值。例如,在这种情况下,您需要nth_value() Windows函数时,学校中得分最高的人,销售业绩最好的人等。
结果,该函数从一组有序行中返回第n个行值。语法如下:
nth_value()顺序(按<表达式>分区按<表达式>顺序)
让我们使用此函数来找出谁是表中的最大买家。
杂项功能
到目前为止,我们已经讨论了非常具体的功能。现在,我们将探讨一些其他功能,这些功能无法归类到特定的功能组中,但具有巨大的价值。
- 兑换有时,您可能希望将输出值转换为指定的数据类型。此外,您可以将其视为强制转换,可以在其中更改值的数据类型。它的语法很简单:convert(value,type)我们可以在打印值之前使用它来转换日期列的数据类型。
- 一片空白通常,如果您不为属性指定非值,则很可能在该列中使用一些空值。但是,您可以使用isull()函数轻松处理它们。您只需要在函数内编写表达式。它将为空返回1,否则返回0。
-
- 看起来我们表中的lastname属性有一些空值!
- 如果最后,您将在SQL中使用的最重要的函数是if()函数。它使您可以定义在任何编程语言中遇到的if条件。它具有简单的语法:if(expression,value_if_true,value_if_false)使用此功能,让我们找出哪个客户支付了超过1000的订单金额。
-
- 此外,此功能的使用是无限的,并且正确地经常用于数据分析任务。
尾注
总而言之,我们介绍了许多基本的SQL函数,这些函数必将在日常数据分析任务中大量使用。
如果你对数据分析感兴趣,可以了解一下九道门商业数据分析实训课的设计,或许能找到入门的最佳途径!