返回首页

gbase数据、南大通用产品文档:GBase8s移除 DSN

更新日期:2024年09月11日

访问“ODBC Data Source Administrator”对话框来移除 DSN。
要移除 DSN,请:
1.
遵循来自 配置新的用户 DSN 或系统 DSN 的步骤 1 和 2。
2.
在“ODBC Data Source Administrator”对话框中点击移除。
“32 位 ODBC Administrator”对话框打开。
3.
点击是,来移除 DSN 并返回至“ODBC Data Source Administrator”对话框。

您可在 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 编号函数将唯一的行编号指定到每一行:
o
ROW_NUMBER 和 ROWNUMBER,其为同义词

OLAP 分等级函数为每一行指定等级:
o
LAG
o
LEAD
o
RANK

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1533
o
DENSE_RANK
o
PERCENT_RANK
o
CUME_DIST
o
NTILE

OLAP 聚集函数聚集行数据:
o
FIRST_VALUE
o
LAST_VALUE
o
RATIO_TO_REPORT
o
AVG
o
COUNT
o
MAX
o
MIN
o
RANGE
o
STDEV
o
SUM
o
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;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1534
PARTITION BY 子句为每一组列 a 和 b 的值创建 window 分区。
ORDER BY 子句按照列 c 和 d 的值对每一 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 列的值。
下列图示展示该查询如何对数据分区、排序和聚集。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1535


该查询返回单个的 window 分区的 c 和 d 列的值以及列 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)。对于最后
的值,不存在当前行的下一个值。
OLAP 编号函数表达式
OLAP 编号函数表达式为单个查询的结果集中的每一行返回一序列的编号。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1536
OLAP 编号函数表达式是您可在 SELECT 语句的 Projection 列表中包括,或在
SELECT 语句的 ORDER BY 子句中包括的 OLAP window 表达式。
语法
OLAP OLAP window

编号函数的 OVER 子句

用法
对于同一函数,关键字 ROW_NUMBER 与 ROWNUMBER 是同义词。此编号函
数就像是一个不要求 window ORDER 子句且不检查重复值的简化的 RANK 函
数。ROW_NUMBER 函数往往为每一 OLAP window 分区中的每一行返回唯一的
值。
ROW_NUMBER 函数不带参数,但您必须在 ROW_NUMBER(或
ROWNUMBER)关键字之后包括空的圆括号。
ROW_NUMBER 函数为每一 OLAP 分区中的每行返回一无符号整数。每一分区
中的行编号的序列起始于 1,且每一后续的行增 1,不论 window 分区中连续的
行是否有相同的或不同的列值。
如果未指定 window PARTITION 子句,则完整的结果集从 1 至 n 编号,此处,
n 是查询或子查询返回的满足条件的行的数目。
OVER 子句为编号函数定义的 OLAP window 有此语法:

window PARTITION 子句是可选的。如果未指定,则编号函数的作用域为
查询或子查询的整个结果集,而不是分区了的子集。

window ORDER 子句是可选的。如果未指定,则返回的行编号是基于在查
询处理时这些行的缺省顺序。如果指定 window ORDER 子句,则
ORDER BY 规范决定行编号的分配。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1537

对于 OLAP 编号函数,不支持 window Frame 子句。
如果为 ROW_NUMBER 函数定义 OLAP window 的 OVER 子句省略 window
PARTITION 子句和 window ORDER 子句,则您必须在 OVER 关键字之后包括
空的圆括号。
示例:ROW_NUMBER 函数
下列查询通过不同的包类型(pkg_type)对产品表中的行进行分区,并为每一分区
指定从 1 重新开始的行编号。
SELECT ROW_NUMBER()
OVER(PARTITION BY pkg_type ORDER BY prod_name)
AS rownum, prod_name, pkg_type
FROM product;

ROWNUM PROD_NAME PKG_TYPE
1 Aroma Sounds CD Aroma designer box
2 Aroma Sounds Cassette Aroma designer box
1 Christmas Sampler Gift box
2 Coffee Sampler Gift box
3 Easter Sampler Basket Gift box
4 Spice Sampler Gift box
5 Tea Sampler Gift box
1 Aroma Roma No pkg
2 Aroma baseball cap No pkg
3 Aroma t-shirt No pkg
4 Assam Gold Blend No pkg
5 Assam Grade A No pkg
6 Breakfast Blend No pkg
7 Cafe Au Lait No pkg
8 Coffee Mug No pkg
9 Colombiano No pkg
10 Darjeeling Number 1 No pkg
11 Darjeeling Special No pkg
12 Demitasse Ms No pkg
13 Earl Grey No pkg
...

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1538
由于 window ORDER 子句指定 prod_name 列作为排序键,因此,在缺省的
(ASC)顺序中,返回的行编号是基于产品名称的字母顺序。例如,在 "No pkg"
分区内,将三个 "Aroma" 产品编号为 1、2 和 3。(在缺省的 ASCII 顺序规则
中大写字母排序在小写之上。)
OLAP 分等级函数表达式
您可包括 OLAP 分等级函数表达式来计算可应用于查询或子查询的分区了的结果
集中每一行的顺序等级。
OLAP 分等级函数表达式是您可包括在 SELECT 语句的 Projection 列表中,或
SELECT 语句的 ORDER BY 子句中的 OLAP window 表达式。
语法
OLAP 分等级函数表达式

OLAP 分等级函数

分等级函数的 OVER 子句

用法
这些函数返回的分等级的值依赖于 OVER 子句内的 window ORDER 子句。
ORDER 子句定义数据库服务器用来计算分等级的值的列或表达式。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1539
如果您省略 window PARTITION 子句,则分等级函数的作用域是查询或子查询的
整个结果集,而不是结果的分区了的子集。
LAG 和 LEAD 函数
LAG 和 LEAD 函数是 OLAP 分等级函数,在从当前 window 分区内的当前行
的指定偏移量上,为该行返回它们的 expression 参数的值。
语法
LAG 和 LEAD 函数

元素
描述
限制
语法
default
如果 offset 超出当
前的 window 分区,
则返回的值
如果未指定 default,则对于任何作
用域之外的行返回 NULL 值。
列表达式
expression 为从当前行的
offset 行的行返回
的列名称、别名或常
量表达式
如果 expression 引用一列,则该列
必须也在 Projection 子句的选择列
表中。
列表达式
offset
定义从当前行的该位
置的偏移量的非负整
数常量
需要 window PARTITION 子句。如果
为零,则指定当前的行。如果未指定
offset,则使用值 1。
文字整数
用法
需要 expression 参数。从 LAG 或 LEAD 函数返回值的数据类型为该表达式的
数据类型。
基于 window ORDER 子句对每一 window 分区执行的排序顺序,LEAD 和
LAG 函数返回在从当前行的 offset 行的每行的表达式的值:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1540

对于 LAG 函数,offset 表明在当前行前面 offset 行的那一行。

对于 LEAD 函数,offset 表明当前行后面 offset 行的那一行。
如果 OVER 子句未包括 window PARTITION 子句,则这些函数为查询的整个结
果集返回 expression 值。
如果指定 window PARTITION 子句,则 LAG 函数的第二个参数(offset)意味
着当前行之前的 offset 行,且在当前分区内。对于 LEAD 函数,第二个参数意
味着当前行之后的 offset 行,且在当前分区内。
对于两个函数,如果未指定 offset,则使用值 1。如果指定可选的第三个参数
(default),其可为表达式,则如果 offset 超出当前分区的作用域,则返回它的
值。否则,返回 NULL 值。当指定第三个参数时,也必须指定第二个参数。
处理 NULL 值
在 LAG 或 LEAD 函数表达式中,可以在两个位置之一中指定可选的 RESPECT
NULLS 或 IGNORE NULLS:

在参数列表中

紧跟在定界参数列表的收圆括号之后
然而,如果您在同一 LAG 或 LEAD 表达式内在这两个位置都包括 RESPECT
NULLS 或 IGNORE NULLS,则数据库服务器发出例外。
RESPECT NULLS 和 IGNORE NULLS 关键字有这些作用:

如果您指定 RESPECT NULLS 关键字,则当计数到 offset 行时,包括其
expression 求值为 NULL 的行。

如果您指定 IGNORE NULLS 关键字,则当计数到 offset 行时,不包括
其 expression 求值为 NULL 的任何行。
如果您指定 IGNORE NULLS,且该 window 分区中行的所有
expression 值都是 NULL,则 LAG 或 LEAD 函数为每一行都返回
default 值。如果未指定 default 参数,则该函数返回 NULL 值。
示例:LEAD 和 LAG 函数
在下列查询中,LAG 函数和 LEAD 函数分别定义了按照部门将员工分区的
OLAP window,并罗列它们的薪资。LAG 函数展示与同一部门中享有下一更低薪

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1541
资值的员工相比,每一员工收到多少更多的补偿。LEAD 函数指示与同一部门中
享有下一更高薪资值的员工相比,每一员工收到的少多少。
SELECT name, salary, LAG(salary)
OVER (PARTITION BY dept ORDER BY salary),
LEAD(salary, 1, 0)
OVER (PARTITION BY dept ORDER BY salary)
FROM employee;

name salary (lag) (lead)
John 35,000 38,400
Jack 38,400 35,000 41,200
Julie 41,200 38,400 45,600
Manny 45,600 41,200 47,300
Nancy 47,300 45,600 49,500
Pat 49,500 47,300 51,300
Ray 51,300 49,500 0
对于 LAG 函数,名称为 John 的第一行有一 NULL 值,因为未指定缺省值。对
于 LEAD 函数,名为 Ray 的最后一行有一 0 值,因为在该 LEAD 函数中指定
0 作为第三个参数的缺省值。
RANK 函数
RANK 函数是一个 OLAP 分等级函数,为 OLAP window 中的每一行计算分等
级的值。返回值是一个顺序编号,其基于 OVER 子句中所需要的 ORDER BY 表
达式。
语法
RANK 函数

用法
行的等级定义为 1 加上排在该行的等级前面的行数。如果两行或多行有相同的
值,则这些行也得到相同的等级。结果在连续的分了等级的值的序列中可有间

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1542
隔。例如,如果将两行分为等级 1,则下一等级为 3。对于包括非唯一的值的分
等级的行,DENSE_RANK 函数使用不同的规则。
RANK 函数没有参数,但必须指定空的圆括号。如果 OVER 子句指定可选的
window PARTITION 子句,则在每一分区定义的行的子集内计算等级。
示例:RANK 函数
下列查询按照销售人员的销售量对他们分等级。这些等级不是连续的,因为销售
量相同的人员都指定相同的等级值,且跳过下一等级值。
SELECT emp_num, sales,
RANK() OVER (ORDER BY sales) AS rank
FROM sales;

emp_num sales rank
101 2,000 1
102 2,400 2
103 2,400 2
104 2,500 4
105 2,500 4
106 2,650 6

DENSE_RANK 函数
DENSE_RANK 函数是一个 OLAP 分等级函数,为 OLAP window 中的每一行计
算等级值。返回值是一个顺序编号,其基于在 OVER 子句中所需要的 ORDER
BY 表达式。
语法
DENSE_RANK 函数

用法

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1543
将一行的等级定义为 1 加上该行的等级前面的等级数目。如果两行或多行有相同
的值,则这些行得到相同的等级。然而,与 RANK 函数相反,如果两行或多行
同级,则在分等级的值的序列中没有间隔。例如,如果两行都分等级为 1,则下
一等级仍为 2。
此函数没有参数,但必须指定空的圆括号。如果 OVER 子句指定可选的 window
PARTITION 子句,则在每一 window 分区定义的行的子集之内计算
DENSE_RANK 等级。
示例:DENSE_RANK 函数
下列查询按照销售人员的销售量对他们分等级。即使多个销售量有相同
的等级,等级也是连续的。
SELECT emp_num, sales,
DENSE_RANK() OVER (ORDER BY sales) AS dense_rank,
FROM sales;

emp_num sales dense_rank

101 2,000 1
102 2,400 2
103 2,400 2
104 2,500 3
105 2,500 3
106 2,650 4
PERCENT_RANK 函数
PERCENT_RANK 函数是一个 OLAP 分等级函数,为 OLAP window 中的每一
行计算等级值,规格化为从 0 至 1 的范围。
计算每一 PERCENT_RANK 值为该行的 RANK 减去 1,除以该分区内行的数目
减去 1。通常,越接近于 1 的值表示等级越高,而越接近 0 的值通常表示越低
的等级。
语法
PERCENT_RANK 函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1544

用法
此函数不用参数,但必须指定空的圆括号。如果还指定可选的 window
PARTITION 子句,则在每一分区定义的行的子集之内计算等级。如果分区中有
单个行,则它的 PERCENT_RANK 值为 0。
示例:PERCENT_RANK 函数
下列查询按照销售人员的销售量将他们分等级。
SELECT emp_num, sales,
PERCENT_RANK() OVER (ORDER BY sales) AS per_rank
FROM sales;

emp_num sales per_rank

101 2,000 0
102 2,400 0.2
103 2,400 0.2
104 2,500 0.6
105 2,500 0.6
106 2,650 1.0
CUME_DIST 函数
CUME_DIST 函数是一个 OLAP 分等级函数,计算累计分布作为每一行的百分比
等级。该等级表示为取值范围从 0 至 1 的实际值小数。
语法
CUME_DIST 函数

用法

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1545
CUME_DIST 函数计算等级低于或等于当前的行,包括当前行的行的数目,除以
该分区中行的总数。越接近 1 的值表示越高的等级,而越接近 0 的值表示越低
的等级。
此函数不用参数,但必须指定空的圆括号。如果还指定可选的 window
PARTITION 子句,则在每一分区定义的行的子集之内计算等级。如果在该分区
中有单个行,则它的 CUME_DIST 值为 1。
示例:CUME_DIST 函数
下列查询展示每个销售人员的销售量的累计分布。
SELECT emp_num, sales,
CUME_DIST() OVER (ORDER BY sales) AS cume_dist
FROM sales;

emp_num sales cume_dist

101 2,000 0.166666667
102 2,400 0.500000000
103 2,400 0.500000000
104 2,500 0.833333333
105 2,500 0.833333333
106 2,650 1.000000000
NTILE 函数
NTILE 函数是一个 OLAP 分等级函数,将每一分区中的行划分成 N 等级的类
别,称为片,每一类别包括大约相等的行数。
语法
NTILE 函数

元素
描述
限制
语法

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1546
unsigned 指定要分等级为
多少个类别,或
片的无符号整数
不可为零
文字整数
用法
由该函数的无符号整数参数设置分等级的类别,或片的数量,且在 OVER 子句的
ORDER BY 表达式之上。
例如,对于查询结果集中的所有行的 dollars 列中的值,下列分等级函数表达式
返回从 1 至 100 的百分比的等级:
NTILE(100) OVER(ORDER BY dollars)
当该参数为 4 时,返回的值将 OVER 子句定义的每一分区中的行排序成四个等
分。当一组值不能由指定的整数参数分开时,NTILE 函数将剩余的行放置在低等
级的片中。
示例:NTILE 函数
下列查询按照员工薪酬将部门中的员工分等级,并对于每一部门计算 1
至 5 的片数。
SELECT name, salary,
NTILE(5) OVER (PARTITION BY dept ORDER BY salary)
FROM employee;
name salary (ntile)
John 35,000 1
Jack 38,400 1
Julie 41,200 2
Manny 45,600 2
Nancy 47,300 3
Pat 49,500 4
Ray 51,300 5
从最低到最高对薪酬排序,因为 ORDER BY 子句的缺省的排序方向为升序。如
果您在 ORDER BY 子句中包括 DESC 关键字,则从最高到最低对薪酬排序。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1547
OLAP 聚集函数表达式
OLAP 聚集函数表达式可返回关于查询的分区了的结果中行的聚集信息。
OLAP 聚集函数表达式是 OLAP window 表达式,您可在 SELECT 语句的
Projection 列表中,或在 SELECT 语句的 ORDER BY 子句中包括它。
语法
OLAP 聚集函数表达式

OLAP 聚集函数

聚集函数的 OVER 子句

用法
您可通过指定 window 框架将 OLAP 聚集函数应用于 OLAP window 分区中行
的子集。

FIRST_VALUE 函数
FIRST_VALUE window 聚集函数为每一 OLAP window 分区中的第一行返回指定
的表达式的值。
语法

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1548
FIRST_VALUE 函数

元素
描述
限制
语法
expression 列名称、别名或
常量表达式
如果 expression 引用一列,
则该列必须也在该 Projection
子句的选择列表中
列表达式
用法
FIRST_VALUE 函数返回的数据类型是指定的表达式的数据类型。结果可为
NULL。如果指定 IGNORE NULLS,则在计算中不考虑行的表达式值求值为
NULL 的所有行。如果指定 IGNORE NULLS,且在该 OLAP window 中的所有
值都是 NULL,则 FIRST_VALUE 函数返回 NULL 值。
或可在紧跟在表达式之后的圆括号内,或可在圆括号的外部指定 RESPECT
NULLS 或 IGNORE NULLS 选项,但仅允许一个这样的规范。
示例:FIRST_VALUE 函数
下列语句返回 window 分区中按天排的存货价格,以及与第一个值 18.25 的存货
价格的差异。
SELECT price, price – FIRST_VALUE(price)
OVER (PARTITION BY year ORDER BY tradingday)
AS diff_price
FROM stock_price
WHERE tradingday between '2012-11-01' and '2012'-11-07';

price diff_price
18.25 0
18.37 0.12
19.03 0.78
18.59 0.34

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1549
18.21 -0.04
LAST_VALUE 函数
LAST_VALUE window 聚集函数为每一 OLAP window 分区中的最后一行返回指
定的表达式的值。
语法
LAST_VALUE 函数

元素
描述
限制
语法
expression 列名称、别名或
常量表达式
如果 expression 应用一列,
则该列必须也在该 Projection
子句的选择列表中
列表达式
用法
LAST_VALUE 函数的返回数据类型是指定的表达式的数据类型。该结果可为
NULL。如果指定 IGNORE NULLS,则在计算中不考虑行的表达式值求值为
NULL 的所有行。如果指定 IGNORE NULLS 且 OLAP window 中的所有值都是
NULL,则 LAST_VALUE 函数返回 NULL 值。
或可在紧跟在该表达式之后的圆括号之内,或可在圆括号外部设置 RESPECT
NULLS 或 IGNORE NULLS 选项,但仅允许一个这样的规范。
RATIO_TO_REPORT 函数
RATIO_TO_REPORT 基于该函数的数值参数,计算每一行对于该 window 分区
中剩余行的分数比率。
语法
RATIO_TO_REPORT 函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1550

元素
描述
限制
语法
expression 列名称、别名或
常量表达式
该 expression 必须求值为数
值的数据类型。DATE、
DATETIME 和 INTERVAL 列不是
有效的。如果 expression 引
用一列,则该列也必须在该
Projection 子句的选择列表
中。
列表达式
用法
此函数计算一行中指定的数值列的值对 OLAP window 框架中每一分区中所有行
的值的总和的比率。名称 RATIOTOREPORT 是 RATIO_TO_REPORT 的关键字
同义词。
同所有 OLAP window 聚集函数一样,Window PARTITION、Window ORDER 和
Window Frame 子句是可选的。可将该比率应用于分区了的行,或应用于整个查询
结果集。如果还指定 window Frame 子句,则该比率应用于来自当前 window 框
架的所有行。
所需要的 expression 参数必须指定数值数据类型的列,或为求值为数值数据类型
的常量表达式。如果 expression 不是数值数据类型,则该函数失败并报错消息 -
25862。
如果当前 window 分区中所有行的 expression 值的总和为零,则此函数为那个分
区中的每一行返回 NULL 值。
如果诸如 SUM 或 MAX 这样的另一 OLAP 聚集函数有一空的 OVER 子句,
或如果 OVER 子句仅包含单个 window PARTITION 规范,则对于该分区中的每
行,该 OLAP 函数的结果都一样。然而,对于 RATIO_TO_REPORT,不是这种
情况,因为对同一 window 分区中的不同行指定不同的比率,每一分区合计(大
约)为 1。要将比率转换为百分率,将该函数表达式乘以 100,如下例所示。
示例:RATIO_TO_REPORT 函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1551
下列示例基于该查询返回的所有行,计算每一城市的销售额的十进制小数,作为
每一城市展示销售额合计的单个报告。
SELECT city, SUM(dollars) AS SALES,
RATIO_TO_REPORT(SUM(dollars)) OVER() *100 AS
RATIO_DOLLARS
FROM sales, store, period
WHERE sales.store_id = store.store_id
AND sales.period_id = period.period_id
GROUP BY CITY
ORDER BY SALES DESC;

CITY SALES RATIO_DOLLARS
San Jose 896931.15 12.58
Atlanta 514830.00 7.22
Miami 507022.35 7.11
Los Angeles 503493.10 7.06
Phoenix 437863.00 6.14
New Orleans 429637.75 6.03
Cupertino 424215.00 5.95
Boston 421205.75 5.91
Houston 417261.00 5.85
New York 397102.50 5.57
Los Gatos 394086.50 5.53
Philadelphia 392377.75 5.50
Milwaukee 389378.25 5.46
Detroit 305859.75 4.29
Chicago 294982.75 4.14
Hartford 236772.75 3.32
Minneapolis 165330.75 2.32
在上述示例中,RATIO_TO_REPORT 的 expression 参数是数值的聚集函数表达
式 SUM(dollars)。输出的最后一行表明 city Minneapolis 的 sales 值大约是该
查询报告的合计销售额的 2.32%。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1552
OLAP window 聚集函数
从查询的结果返回聚集结果的几个函数,诸如总和和平均值,还可用作来自
OLAP window 的上下文的 OLAP 函数。
语法
Window 聚集函数

元素
描述
限制
语法
column_expr 聚集函数的列表达式参

请参阅下面的单独函
数的标题
标识符
alias,
synonym,
table, view
包含 column 的同义
词、表、视图或别名
Synonym 以及它指向
的 table 或 view
必须存在
标识符
用法
这些聚集函数不要求 OLAP window 从查询结果集计算聚集值。然而,在调用的
上下文中它们的行为像 OLAP window 聚集函数一样,在此,函数表达式中的
OVER 子句定义一个或多个 window 分区,或包括 window ORDER 子句和
window Frame 子句。
重要: 当 DISTINCT 或 UNIQUE 关键字是 window 聚集函数规范的一部分时,
window 聚集表达式的 OVER 子句不可包括 Window ORDER 子句或 Window Frame
子句。
下列聚集函数可返回关于 OLAP window 分区中的行的信息。
AVG 函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1553
对于在 OVER 子句中定义的每一分区中的行,AVG 函数返回在查询结果的
window 分区中指定的列或表达式中所有值的平均值。如果 OVER 子句包括
Window Frame 子句,则 AVG 为 window frame 中的每一组行返回一个值。
您仅可将 AVG 函数应用于数值数据类型的列。如果您使用 DISTINCT(或
UNIQUE)关键字,则仅从指定的列或表达式中 distinct 值计算平均值(含义为
平均),且 OVER 子句不可包括 Window ORDER 或 Window Frame 子句。
忽略 NULL 值,除非该列或表达式中的每个值都是 NULL。如果每个值都是
NULL。则 AVG 函数为那个列或表达式返回 NULL。
您不可以非数值的列或表达式使用 AVG 函数。
COUNT 函数
对于在 OVER 子句中定义的每一分区,COUNT 函数返回查询结果的 window
分区中指定的列或表达式中非 NULL 值的基数。如果该 OVER 子句包括
Window Frame 子句,则 COUNT 为 window frame 中的每一组行返回一个值。
如果您使用 DISTINCT(或 UNIQUE)关键字,则仅从指定的列或表达式中
distinct 值计算该分区中行的基数,且 OVER 子句不可包括 Window ORDER 或
Window Frame 子句。
忽略 NULL 值,除非该列或表达式中的每个值都是 NULL。如果每个值都是
NULL,则 COUNT 函数为那个列或表达式返回 NULL。
MAX 函数
对于 OLAP window OVER 子句中定义的每一分区中的行,MAX 函数返回查询
结果的 window 分区中列或表达式中的最大值。
指定 DISTINCT 或 UNIQUE 关键字,对结果没有影响,但(同其他内建的聚集
函数一样)不允许 Window ORDER 或 Window Frame 子句。
如果 OVER 子句包括 Window Frame 子句,则 MAX 为 window frame 中每一
组行返回一个值。
当指定列表达式作为 COUNT 的参数时,忽略 NULL 值,除非指定的列表达式
中每个值都是 NULL。如果每个值都是 NULL,则 MAX 为那个列或表达式返回
NULL 值。当指定 COUNT(*) 时,如同其他值一样,对 NULL 值计数。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1554
MIN 函数
对于 OLAP window OVER 子句定义的每一分区,MIN 函数返回查询结果的
window 分区中列或表达式中的最小值。如果 OVER 子句包括 Window Frame 子
句,则 MIN 函数为每一组行返回一个值。
指定 DISTINCT 或 UNIQUE 关键字,对结果没有影响。但(同其他内建的聚集
函数一样)不允许 Window ORDER 或 window Frame 子句。
如果 OVER 子句包括 Window Frame 子句,则 MIN 为 window frame 中的每一
组行返回一个值。
忽略 NULL 值,除非指定列表达式中的每个值都是 NULL。如果每个值都是
NULL,则 MIN 为那个列表达式返回 NULL 值。
RANGE 函数
对于 OLAP window OVER 子句定义的每一分区,RANGE 函数返回查询结果的
window 分区中列或表达式中值的范围。如果 OVER 子句包括 Window Frame 子
句,则 RANGE 为 window frame 中每一组行返回一个值。
RANGE 函数计算最大值与最小值之间的差,如下:
range(expr) = max(expr) - min(expr)
您仅可将 RANGE 函数应用于数值的列表达式。下列查询找到人口的年龄的范围:
SELECT RANGE(age) OVER () FROM u_pop;
由于 DATE 值在内部作为整数保存,因此您可对 DATE 列使用 RANGE 函
数。使用 DATE 列,返回值是该列表达式中最早日期与最晚日期之间的天数。
忽略 NULL 值,除非列表达式中的每个值都是 NULL。如果每个列表达式值都
是 NULL,则 RANGE 函数为那个列表达式返回 NULL。
STDEV 函数
STDEV 函数返回列或表达式的标准差,使用下列公式:
SQRT((SUM(Xi2) - (SUM(Xi)2)/N)/(N - 1))
在此公式中,Xi 是 OVER 子句指定的 window 分区或 frame 中每一列表达式
值,N 是列表达式中非 NULL 值的总数。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1555
如果 OVER 子句包括 Window Frame 子句,则 STDEV 函数为 window frame
中每一组行返回一个值。
忽略 NULL 值,除非指定的列表达式中每个值都是 NULL。如果每个列表达式
都是 NULL,则 STDEV 函数为那个列表达式返回 NULL。
您仅可对数值的列表达式应用 STDEV 函数。您不可对 DATE 类型的列表达式
使用此函数。
SUM 函数
对于 OLAP window OVER 子句中定义的每一分区中的行,SUM 函数计算并返回
查询结果的 window 分区中列表达式的所有值的总和。
如果您使用 DISTINCT(或 UNIQUE)关键字作为参数列表中的第一项,则该总
和仅针对于列或表达式中的 distinct 值,且不允许 Window ORDER 或 Window
Frame 子句。
忽略 NULL 值,除非每个值都是 NULL。如果每个值都是 NULL,则 SUM 函
数为那个列或表达式返回 NULL 值。
您不可以非数值的列或表达式使用 SUM 函数。
VARIANCE 函数
对于跟在 OLAP window VARIANCE 表达式之后的 OVER 子句中定义的查询结
果的分区,VARIANCE 函数计算并返回均方差作为对指定的数值列或表达式中值
的总体方差的估算。
如果 OVER 子句包括 Window Frame 子句,VARIANCE 函数为每一组行返回一个
值,使用下列公式:
(SUM(Xi2) - (SUM(Xi)2)/N)/(N - 1)
在此公式中,

Xi 是 OVER 子句指定的 window 分区或 frame 中每一列值,

N 是该列中非 NULL 值的合计数(除非所有值都是 NULL,在此情况下
未逻辑地定义该方差,且 VARIANCE 函数返回 NULL)。
您仅可对数值的列应用 VARIANCE 函数。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1556
示例:带有分区的 AVG 函数
在下列示例中,在 OLAP window 聚集表达式中使用 AVG 函数来返回两个
window 分区在 2012 年期间的移动平均数 closeprice 列值,基于 symbol 列
中的 ABC 和 XYZ 值作为分区键。
SELECT symbol, tradingdate,
AVG(closeprice) OVER (PARTITION BY symbol
ORDER BY tradingdate
ROWS BETWEEN 29 PRECEDING AND CURRENT ROW)
FROM dailystockdata
WHERE symbol IN ('ABC', 'XYZ')
AND tradingdate BETWEEN '2012-01-01' AND '2012-12-31';
window ORDER 子句指定 tradingdate 列值作为排序键,且 window Frame 子
句定义基于 30 个连续的 tradingdate 值的移动 window,以当前行的
tradingdate 结束。
示例:不带有分区的 AVG
下列查询返回按天排序的存货价格以及当前天、前一天和后一天的平均价格。由
于该查询未包括 PARTITION BY 子句,因此结果集不分区。
SELECT price, AVG(price) OVER (ORDER BY tradingday
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
FROM stock_price
WHERE tradingday BETWEEN '2012-11-01' AND '2012-11-07';

price (avg)
18.25 18.31
18.37 18.31
18.37
19.03
19.03 18.81
18.59 18.61
18.21 18.40
avg 列中的第一个值是 price 列中前两个值的平均值,因为对于 price 列的第一
个值没有前面的值。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1557
avg 列中的第二个值是 price 列中前两个值的平均值,因为 price 列的第三行没
有值。
avg 列中的第三个值等于 price 列中的第二个值,因为 price 列中的第三行和第
四行没有值。
示例:COUNT 函数
下列查询返回装运日期、装运费用和按客户排列的每一订单的订单数目。按客户
编号对查询结果分区,并限定客户编号小于或等于 110。
SELECT customer_num, ship_date, ship_charge,
COUNT(*) OVER (PARTITION BY customer_num)
FROM orders
WHERE customer_num <= 110;

customer_num ship_date ship_charge (count(*))
101 05/26/2008 $15.30 1
104 05/23/2008 $10.80 4
104 07/03/2008 $5.00 4
104 06/01/2008 $10.00 4
104 07/10/2008 $12.20 4
106 05/30/2008 $19.20 2
106 07/03/2008 $12.30 2
110 07/06/2008 $13.80 2
110 07/16/2008 $6.30 2
客户 104 在列表中出现四次。客户 104 在 count 列中的值始终是 4。
OLAP window 表达式的 OVER 子句
OVER 子句定义在其上执行 OLAP window 表达式的结果集。
语法
OVER 子句


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1558
编号函数的 OVER 子句

分等级函数的 OVER 子句

聚集函数的 OVER 子句

Window PARTITION 子句

Window ORDER 子句

Window Frame 子句

元素
描述
限制
语法

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1559
offset
表示从当前行位置的
偏移量的无符号整数
不可为负的。如果为零,
则指定当前的行
整数
partition_key
由其对行分区的列名
称、别名或常量表达

必须在 Projection 子句
的选择列表中
列表达

sorting_key
由其对行排序的列名
称、别名或常量表达

与对于 partition_key
的限制相同。对于 RANGE
window frame,仅允许单
个排序键,且数据类型必
须为数值的、DATE 或
DATETIME。
列表达

如果 OVER 子句为空,则您必须还包括空的圆括号。
Window PARTITION 子句
OLAP window 分区是由查询返回的行的子集。通过定义该 window 的 OVER 子
句的 PARTITION BY 规范中的一个或多个列表达式定义每一分区。数据库服务
器将指定的 OLAP window 函数应用于每一 window 分区中的所有行。如果在
OVER 子句中未定义分区,则将 window 函数应用于该查询的结果集中的每行。
Window ORDER 子句
数据库服务器根据 window ORDER 子句中的排序键(或多个排序键)对每一
window 分区中的行排序。如果您未指定升序(ASC)或降序(DESC)顺序,则
缺省值为 ASC。如果未指定 ORDER 子句,则按照检索到的行的顺序排列符合
条件的行。
Window Frame 子句
window Frame 子句返回每一 window 分区中的行的子集,称为聚集组。由特定数
目的行或值的范围来定义 window frame。
基于行的 window frame
ROWS 关键字创建基于行的 window frame,这由在当前行之前或之后或之前与之
后的特定数量的行组成。该偏移量表示要返回的行的数目。下列示例返回包括当
前行以及当前行之前六行的七行:
AVG(price) OVER (ORDER BY year, day

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1560
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)
在基于行的 window frame 子句中,偏移量表示为无符号整数,因为关键字
FOLLOWING 指定从当前行的正偏移量,而关键字 PRECEDING 指定从当前行
的负偏移量。关键字 UNBOUNDED 指的是从当前行至该 window 分区的限度的
所有行。作为在 window Frame 规范中 ROWS 关键字之后的第一个术语,
UNBOUNDED PRECEDING 意味着起始边界为该分区中的第一行, 而
UNBOUNDED FOLLOWING 意味着终止边界为该分区中的最后一行。
基于值的 window frame
RANGE 关键字创建基于值的 frame 子句,由当前行与满足标准的行组成,通过
ORDER 子句中的排序键设置该标准并符合指定的偏移量。偏移量表示排序键的
数据类型的单位数目。排序键必须为数值的、DATE 或 DATETIME 数据类型。
例如,如果排序键为 DATE 数据类型,则偏移量表示特定的天数。下列示例返回
发运日期在当前行的两天之内的行的数目加上当前行的总数:
COUNT(*) OVER (ORDER BY ship_date
RANGE BETWEEN 2 PRECEDING AND 2 FOLLOWING)
基于值的 window frame 定义在包含指定范围的数值值的 window 分区内的行。
OVER 函数的 window ORDER 子句定义应用 RANGE 规范的数值的、DATE 或
DATETIME 列,现对于那一列的当前行值。在基于值的 window frame 的
ORDER 子句中仅允许排序键。
在基于行和基于值的这两种情况下,在此 window frame 的内容上计算 OLAP 函
数,而不是在整个分区的固定的内容上计算。window frame 不需要包含当前行。
例如,下列规范定义仅包含当前行之前的行的 window frame:
ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING
如果您未为 window 聚集函数指定 window ORDER 子句,则在缺省情况下,不
限制结果集,其等同于下列 window frame 规范:
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED
FOLLOWING
如果您为 window 聚集函数指定 ORDER 子句但无 window frame 子句,则在缺
省情况下,返回当前行之前的所有行以及当前行,其等同于下列 window frame
规范:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1561
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
示例:不带有 window frame 的 SUM 函数
下列查询返回按一年的季度的销售额,以及按季度的销售额的累积总和。
SELECT sales, SUM(sales) OVER (ORDER BY quarter)
FROM sales WHERE year = 2012

sales (sum)
120 120
135 255
127 382
153 535
第四季度的销售额的总和等于所有四个季度中的销售额。
由于该查询未包括 window frame 子句,因此,SUM 函数如通过 FROM 子句指
定的那样,在整个结果集上操作。
示例:基于行的 window frame
下列查询按照团队分区并按照分数排序来返回运动员。在每一分区内,对该运动
员以及与前面的运动员的分数求平均值:
select team, player, points,
AVG(points) OVER(PARTITION BY team ORDER BY points
ROWS 1 PRECEDING AND CURRENT ROW) AS olap_avg
FROM points;

TEAM PLAYER POINTS OLAP_AVG
A Singh 7 7.00000000000
A Smith 14 10.50000000000
B Osaka 8 8.00000000000
B Ricci 12 10.00000000000
B Baxter 18 15.00000000000
C Chun 13 13.00000000000
D Kwan 9 9.00000000000
D Tran 16 12.50000000000

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1562
示例:基于范围的 window frame
下列查询按照团队分区并按照年龄排序,返回运动员。在每一分区内,对每一运
动员以及最多大 9 岁的运动员的分数求平均值:
SELECT player, age, team, points,
AVG(points) OVER(PARTITION BY team ORDER BY age
RANGE BETWEEN CURRENT ROW AND 9 FOLLOWING) AS olap_avg
FROM points_age;

PLAYER AGE TEAM POINTS OLAP_AVG
Singh 25 A 7 10.50000000000
Smith 26 A 14 14.00000000000
Baxter 27 B 18 13.00000000000
Osaka 35 B 8 10.00000000000
Ricci 40 B 12 12.00000000000
Chun 21 C 13 13.00000000000
Kwan 22 D 9 12.50000000000
Tran 31 D 16 16.00000000000
在分区 A 中,Singh 的平均值包括 Smith 的分数,因为 Smith 比 Singh 大一
岁。Smith 的平均值不包括来自 Singh 的分数,因为 Singh 比 Smith 年轻。
在分区 B 中,Baxter 的平均值包括 Osaka 的分数,其比 Baxter 大 8 岁,但不
包括 Ricci,其比 Baxter 大 13 岁。
在分区 D 中,Kwan 的平均值包括 Tran 的分数,因为 Tran 比 Kwan 大 9
岁。
示例:不带有当前行的 Window frame
下列查询计算分区中前面两行的分数的平均值:
SELECT player, age, team, points,
AVG(points) OVER(PARTITION BY team ORDER BY age
ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING) AS olap_avg
FROM points_age;
PLAYER AGE TEAM POINTS OLAP_AVG
Singh 25 A 7 NULL

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1563
Smith 26 A 14 7.00000000000
Baxter 27 B 18 NULL
Osaka 35 B 8 18.00000000000
Ricci 40 B 12 13.00000000000
Chun 21 C 13 NULL
Kwan 22 D 9 NULL
Tran 31 D 16 9.00000000000
在分区 B 中,Ricci 的平均值是基于 Baxter 和 Osaka 的分数合计:(18 + 8 =
26)/2 = 13。当当前行没有前面的行用于计算时,结果为 NULL。

(SQL 管理 API)

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 804 -
随同 admin() 或 task() 函数,使用 set sql tracing 参数来设置全局 SQL 跟踪。
语法

元素
描述
关键考虑
level
跟踪级别。缺省为 low。
可能的值为:
 low
 med
 high
mode
跟踪所有用户还是选中的用户。
可能的值为:
 global
 user
number_traces
要跟踪的 SQL 语句的数目。缺省值为 1000。

trace_size
跟踪缓冲区大小的 KB 数。
如果超过这个缓冲区大小,

数据库服务器丢弃保存的数据。缺省大小为 2 KB。


用法
使用这个函数来重置 SQLTRACE 配置参数的值。
请使用 set sql tracing info 参数来显示全局 SQL 跟踪的状态。
请使用 set sql tracing off 参数来关闭全局 SQL 跟踪。
请使用 set sql tracing on 参数来开启全局 SQL 跟踪。
您可选择地指定跟踪级别和模式,

更改跟踪缓冲区的大小。
 使用 low 参数来捕获语句统计、语句文本和语句迭代器。
 使用 med 参数来捕获包括在低级跟踪的所有信息,加上表名、数据库名和存储过
程堆栈。

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 805 -
 使用 high 参数来捕获包括在中级跟踪的所有信息,加上主机变量。
 使用 global 参数来启用对所有用户的跟踪。
 使用 user 参数来启用跟踪那些由 set sql tracing user 参数启用跟踪的用户。
当暂停 SQL 跟踪时,使用 set sql tracing resume 参数来重启 SQL 跟踪。
使用 set sql tracing suspend 参数来暂停 SQL 跟踪,而不重新分配任何资源。
示例
下列示例对 1500 SQL 语句启动高级别全局跟踪到 4 KB 跟踪缓冲区内:
EXECUTE FUNCTION task("set sql tracing on","1500","4","high","global");
下列示例暂停 SQL 跟踪:
EXECUTE FUNCTION task("set sql tracing suspend");