分析函数

Vertica 分析是基于 ANSI 99 标准的 SQL 函数。这些函数用于处理复杂的分析和报告任务,例如:

  • 对处于特殊状态的合作时间最长的客户进行排序。

  • 计算指定的一段时间内零售额的移动平均值。

  • 查找同一年级所有学生的最高分数。

  • 对销售人员当前收到的销售奖金与其以前收到的销售奖金进行比较。

分析函数将返回聚合结果,但并不对结果集进行分组。它们会多次返回组值,每个记录一个组值。可以使用 window ORDER BY 子句排序组值或分区,但此顺序仅影响函数结果集,而不影响整个查询结果集。

语法

一般

analytic‑function(arguments) OVER(
  [ window-partition-clause ]
  [ window-order-clause [ window-frame-clause ] ]
)

对于指定窗口

analytic‑function(arguments) OVER(
  [ named‑window [ window‑frame‑clause ] ]
)

参数

analytic‑function(arguments)
Vertica 分析函数及其实参。
OVER
指定如何就当前行而言对窗口框架函数输入进行分区、排序。输入数据是查询在对 FROMWHEREGROUP BYHAVING 子句求值之后返回的结果集。

空的 OVER 子句将提供单个节点中的单线程查询最佳性能。

window‑partition‑clause
根据一个或多个列或表达式对输入行进行分组。

如果忽略此子句,不会进行任何分组,分析函数将所有输入行作为一个分区处理。

window‑order‑clause
可以选择指定如何对提供给分析函数的行进行排序。如果 OVER 子句还包括分区子句,则在每个分区中对行进行排序。
window‑frame‑clause
仅对某些分析函数有效,指定为输入一组与分析函数当前正在评估的行相对的行。函数处理此行及其窗口之后,Vertica 会将当前行向前移动,并相应地调整窗口边界。
named‑window
您在同一个查询中用窗口名称子句定义的一个窗口的名称。此定义将封装窗口分区和排序。当查询调用多个具有类似的 OVER 子句的分析函数时,命名窗口很有用。

窗口名称子句不能指定窗口框架子句。然而,您可以用窗口框架子句将命名窗口限定在 OVER 子句中。

要求

以下要求适用于分析函数:

  • 全部需要 OVER 子句。每个函数都有自己的 OVER 子句要求。例如,您可以为一些分析聚合函数(如 SUM)提供一个空的 OVER 子句。对于其他函数,可能需要窗口框架和命令子句,也可能无效。

  • 只有查询的 SELECTORDER BY 子句才能调用分析函数。

  • 分析函数不可嵌套。例如,不允许下面的查询:

    => SELECT MEDIAN(RANK() OVER(ORDER BY sal) OVER()).
    
  • WHEREGROUP BYHAVING 运算符从技术上讲不是分析函数的一部分。不过,它们可以确定该函数的输入内容。

另请参阅