OLAP window 表达式

您可在 SELECT 语句中包括“联机分析处理”(OLAP)表达式来在查询或子查询的结果集中的行的子集上操作。对于数据中的模式、趋势和例外,您可使用 OLAP window 表达式来检测满足条件的行的子集。

OLAP window 表达式允许应用开发人员更简单地和高效地构成分析业务查询。例如,可在各种不同的间隔之上计算移动平均值和移动总和。可随着选择了的列值更改,重置聚集和等级。可以简单的术语表示复杂的比率。

语法

OLAP window 表达式

在 SELECT 语句的这些子句中,OLAP window 表达式是有效的:
  • Projection 子句的 Select 列表
  • SELECT 语句的 ORDER BY 子句
  • Projection 子句中的子查询规范

OLAP window 表达式需要 OLAP window 函数和 OVER 子句。

OLAP window 函数
OLAP window 函数为数据库服务器表示一个要在查询结果集中的行上执行的操作。OLAP window 函数分为下列函数类别:
  • OLAP 编号函数将唯一的行编号指定到每一行:
    • ROW_NUMBER 和 ROWNUMBER,其为同义词
  • OLAP 分等级函数为每一行指定等级:
    • LAG
    • LEAD
    • RANK
    • DENSE_RANK
    • PERCENT_RANK
    • CUME_DIST
    • NTILE
  • OLAP 聚集函数聚集行数据:
    • FIRST_VALUE
    • LAST_VALUE
    • RATIO_TO_REPORT
    • AVG
    • COUNT
    • MAX
    • MIN
    • RANGE
    • STDEV
    • SUM
    • VARIANCE
OVER 子句
OVER 子句定义在其上执行指定的操作的结果集。OVER 子句由下列功能:
  • 以 PARTITION BY 子句定义 window 分区。OLAP window 分区是查询结果集中行的子集,基于罗列在 PARTITION BY 子句中的一个或多个列表达式的值。
  • 以 ORDER BY 子句将行排序。如果您包括 PARTITION BY 子句,则在每一 window 分区内对结果排序。否则,对整个结果排序。
  • 以 OLAP window 聚集函数的 ROWS 或 RANGE 规范定义 window 框架。window 框架定义 window 分区内的一组行。聚集函数在移动的 window 框架的内容上操作,而不是在整个分区上操作。

例如,下列查询包含 OLAP 聚集函数 SUM:

SELECT c,d,
        SUM(d) OVER(
        PARTITION BY a,b
        ORDER BY c,d
        ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
        FROM table1;

PARTITION BY 子句为每一组列 ab 的值创建 window 分区。

ORDER BY 子句按照列 cd 的值对每一 window 分区内的数据排序。

以 ROWS 关键字开启的 window 框架子句创建由三行组成的 window 框架:当前行、当前行的前一行,以及当前行的后一行。当前行是 window 框架的引用点。下列表格展示当每一行轮流成为当前行时,window 框架如何在结果集中移动。

表 1. 结果集中的 window 框架.

行编号 第一个框架 第二个框架 第三个框架 第四个框架 第五个框架 第六个框架
1 当前的行 当前的行 - 1        
2 当前的行 + 1 当前的行 当前的行 - 1      
3   当前的行 + 1 当前的行 当前的行 - 1    
4     当前的行 + 1 当前的行 当前的行 - 1  
5       当前的行 + 1 当前的行 当前的行 - 1
6         当前的行 + 1 当前的行

SUM 函数为在该查询的作用域中的每一 window 分区加上三行的 d 列的值。

下列图示展示该查询如何对数据分区、排序和聚集。


围绕的文本中描述的图。

该查询返回单个的 window 分区的 cd 列的值以及列 d 的三个值的总和:

c      d     (sum)
        1      1       3
        1      2       6
        1      3       7 
        2      2       9
        2      4       7
        3      1       5
      

sum 列中的第一个值是 d 列中第一个和第二个值的总和 (1 + 2 = 3)。对于第一个值,不存在当前行的前一个值。

sum 列中的第二个值是 d 列中第一个、第二个和第三个值的总和 (1 + 2 + 3 = 6)。

sum 列中的第三个值是 d 列中第二个、第三个和第四个值的总和 (2 + 3 + 2 = 7)。

sum 列中的最后一个值是 d 列中第五个和第六个值的总和 (1 + 4 = 5)。对于最后的值,不存在当前行的下一个值。

1 请参阅 OLAP 编号函数表达式.
2 请参阅 OLAP 分等级函数表达式.
3 请参阅 OLAP 聚集函数表达式.