SQL 中的分析函数2025年3月17日 | 阅读11分钟 分析函数允许用户根据行的分组计算聚合值。这些函数与聚合函数不同,因为它们为每个组返回多个行。返回的行称为分析子句可以定义的窗口。 对于数据库中的每一行,都会定义一个滑动窗口。滑动窗口决定了用于计算当前行值的行的限制。滑动窗口的大小可以是确定的行数,也可以取决于时间等逻辑间隔。 分析函数是查询中执行的最后一系列操作。唯一的例外是 SQL 中使用的 ORDER BY 子句。所有连接和 WHERE、GROUP BY 和 HAVING 子句都将在实现分析函数之前执行。因此,分析函数只能在 select 列表或使用 ORDER BY 子句时实现。 分析函数通常计算累积、移动、中心和报告聚合。 SQL 中分析函数的语法在 SQL 中实现分析函数的语法如下 分析函数中的组件分析函数![]() 要在查询中实现分析函数,请指定要执行的函数的名称。您可以参考分析函数列表来确定要实现的函数。 参数分析函数可以接受 0-3 个参数值。函数中输入的参数可以是数值或可以转换为数值数据类型的非数值数据类型。 SQL 软件会确定哪个参数具有最高的数字优先级,当有多个参数传递到分析函数时。然后它会将参数左侧的数据类型转换为该数据类型。函数返回的值也具有具有最高优先级的参数的相同数据类型。如果用户为特定函数指定了另一种数据类型,则可以更改这一点。 Analytic_Clause![]() OVER 是一个分析子句,用户使用它来指示提到的分析函数在查询结果集上实现。FROM、WHERE、GROUP BY 和 HAVING 子句执行后,将实现此子句。用户可以在列表中的 OVER 子句或使用 ORDER BY 子句来指定分析函数。这些子句使用户能够过滤掉通过实现分析函数生成的结果。它允许将这些函数嵌套在父查询中,然后在 SQL 中过滤嵌套子查询的结果。 关于 analytic_clause 的说明
query_partition_clause另一种类型的分析子句是 PARTITION BY 子句。此子句用于根据一个或多个值表达式将查询结果集分区到组中。如果用户决定从查询中删除此子句,那么分析函数会将所有查询结果行视为一个组。 如果用户想在分析函数中实现 query_partition_clause,那么用户必须执行语法的上部分(无需括号)。如果用户想在模型查询或分区外部连接中使用该子句,请使用带括号的语法。 它允许用户在同一查询中实现多个分析函数。这可以通过使用相同或不同的 PARTITION BY 键来完成。如果被查询的对象具有并行属性,用户也可以提及使用 query_partition_clause 的分析函数。这将使计算也并行执行。 在 value_expr 中可以使用有效值是常量、列、非分析函数、函数表达式或包含上述任何内容的表达式。 Order_by_clause此子句用于分析函数中,以指定分区内数据的排列顺序。用户可以为每个分析函数在分区内对多个键进行值排序。传递到分析函数的每个值都由 value_expr 定义,并且排序序列限定了该表达式。 对于不同的分析函数,用户可以提及多个排序表达式。当用户实现对值进行排名的函数时,这特别有用,因为第二个表达式可用于解决第一个表达式的相同值之间的关系。 如果 order_by_clause 导致多行的值相同,则分析函数的行为如下 以下分析函数将为每行提供相同的结果
ROW_NUMBER 在 order_by_clause 实现后,如果存在两个或多个行具有相同值,则为每行分配不同的值。此不同值由系统处理行的顺序计算。如果 ORDER BY 未能确保总排序,则此方法可能不是确定的。 对于所有其他分析函数,结果可能会根据窗口规范而有所不同。用户可以通过实现 RANGE 关键字来指定逻辑窗口。这将允许所有分析函数为每行提供相同的结果,即使窗口规范不同。如果用户使用 ROW 关键字指定物理窗口,结果将不是确定的。 Order By Clause 的限制对 ORDER BY 子句的实现施加了某些限制 当 order_by_clause 与分析函数一起实现时,必须将一个表达式 (expr) 传递给该子句。SIBLINGS 关键字无效(它只能在分层查询中使用)。在此场景中,位置和列别名 (c_alias) 也无效。否则,这将返回与用于对整个查询或子查询进行排序的 order_by_clause 相同的结果。 实现 RANGE 关键字的分析函数可以在 order by 子句中使用多个排序键,如果它提及了下面提到的任何窗口
这四个窗口只能在 order_by_clause 中包含多个排序键。所有其他边界只能在分析函数的 ORDER BY 子句中包含一个排序键。此限制不适用于由 ROW 关键字确定的窗口边界。 ASC | DESC这些关键字用于指定排序顺序。顺序可以是升序或降序。默认情况下,排序顺序设置为 ASC。 NULLS FIRST | NULLS LAST它确定带有 NULL 值的返回行是否应出现在排序序列的开头或结尾。虽然在升序中 NULL LAST 设置为默认值,而在降序中 NULL FIRST 设置为默认值。 分析函数仅在 order_by_clause 函数确定的顺序对行进行操作。由于函数本身不保证结果的顺序,用户可以实现查询的 order_by_clause 来确保最终结果是有序的。 Windowing_clause某些分析函数支持 windowing_clause。允许用户使用 windowing_clause 的一些分析函数如下
ROWS | RANGE
BETWEEN ... AND这些子句用于确定窗口的特定起点和终点。在 AND 之前输入的第一个表达式指定窗口的开始点,在 AND 之后输入的第二个表达式指定窗口的结束点。 如果用户不使用 BETWEEN 关键字而仅提及窗口的结束点。那么 SQL 将该点视为开始点,窗口的结束点将设置为当前行。 UNBOUNDED PRECEDING用户使用 UNBOUNDED PRECEDING 来指定窗口从分区的第一个行开始。这只能用作开始规范,不能用作结束点规范。 UNBOUNDED FOLLOWING用户使用 UNBOUNDED FOLLOWING 来指定窗口以分区的最后一行结束。这只能用作结束规范,不能用作开始点规范。 CURRENT ROW当用户使用 CURRENT ROW 作为起点时,它指定窗口将从当前行或值开始。这也取决于用户是否提到了 ROW 或 RANGE。如果指定,窗口的终点不能是 value_expr PRECEDING。 当用户使用 CURRENT ROW 作为终点时,它指定窗口将从当前行或值结束。这也取决于用户是否提到了 ROW 或 RANGE。如果指定,窗口的起点不能是 value_expr FOLLOWING。 value_expr PRECEDING 或 value_expr FOLLOWING对于 RANGE 或 ROW
一些常见的分析函数一些分析函数及其执行的功能如下
下一主题Rollback SQL |
我们请求您订阅我们的新闻通讯以获取最新更新。