返回首页

gbase数据、南大通用产品文档:GBase8a_gbase_hash_part_sample_top

更新日期:2024年09月11日

功能
Group by 算子数据hash 划分时采样,
采样结果中,
对数据进行采样获得重复率最
高的N 个值,在做hash 划分时,单独进行划分成为单独的数据块。
取值范围1~100,默认值为5。

RANK OVER 函数
语法
RANK() OVER([PARTITION BY col_name1,col_name2,…]
ORDER BY
col_name1 [ASC/DESC], col_name2 [ASC/DESC],…)
功能描述
根据ORDER BY 子句中表达式的值,从查询返回的每一行计算它们与其它行的
相对位置。组内的数据按ORDER BY 子句排序,然后给每一行赋一个号,从而
形成一个序列,该序列从1 开始,往后累加。
每次ORDER BY 表达式的值发生变化时,该序列也随之增加。有同样值的行得
到同样的数字序号(认为null 是相等的)。
如果两行得到同样的排序,则后面的序数将跳跃。例如,两行序数为1,则没有
序数2,序列将给组中的下一行分配值3。
仅Express 引擎支持。
在查询语句中,可以使用RANK 函数的子句为:

在SELECT 列表中:
SELECT RANK() OVER(PARTITION BY i ORDER BY j) FROM t1 WHERE ...;

在最终ORDER BY 子句中(通过在查询中的其它位置使用RANK 函数的别
名或位置引用):
SELECT *,RANK() OVER (ORDER BY j) FROM t1 WHERE ... ORDER BY
RANK() OVER(ORDER BY i DESC);

在上述两个子句中,作为表达式或标量函数的参数:
SELECT RANK() OVER (ORDER BY j DESC) + i FROM t1 WHERE ...;
SELECT
CONV(RANK()
OVER(PARTITION
BY
i
ORDER
BY
j
ASC),10,2)FROM t
使用约束
下述情况不能使用:

在WHERE 子句的搜索条件中:
SELECT ... FROM t1 WHERE RANK() OVER(ORDER BY i) > 3; -- error

作为聚集函数的参数:
SELECT SUM(RANK() OVER(ORDER BY dollars)) FROM t1; -- error

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
886

RANK 函数不得在HAVING 子句中使用:
SELECT * FROM t1 GROUP BY i HAVING RANK() OVER(ORDER BY j) <
10; -- error

RANK 函数不得在GROUP BY LIST 中:
SELECT * FROM t1 GROUP BY RANK() OVER(ORDER BY i); -- error

RANK 不能嵌套在其它RANK 内部:
SELECT RANK() OVER(ORDER BY RANK() OVER(ORDER BY i )); -- error

RANK 函数不得在DELETE 和UPDATE 语句的非查询部分:
UPDATE t1 SET i = RANK () OVER(ORDER BY j) WHERE ...; --error

但是用在查询部分可以:
UPDATE t1 SET i = i + 1 where j IN (SELECT RANK () OVER(ORDER BY
t2.k) from t2);
-- ok
注意
PARTITION BY 后面不能接ASC/DESC,ORDER BY 后面可以接
ASC/DESC。
示例
示例1:RANK() OVER(PARTITION BY i ORDER BY j desc)
gbase> DROP TABLE IF EXISTS t1;
Query OK, 0 rows affected
gbase> CREATE TABLE t1(i int, j int);
Query OK, 0 rows affected
gbase> INSERT INTO t1 VALUES(2,1),(2,3),(2,3),(2,5),(3,2),(3,2),(3,2),(3,4),
(3,1),(3,5);
Query OK, 10 rows affected
Records: 10
Duplicates: 0
Warnings: 0
gbase> SELECT *,RANK() OVER(PARTITION BY i ORDER BY j des
c) AS rank FROM t1;
+------+------+------+
| i
| j
| rank |
+------+------+------+
|
2 |
5 |
1 |

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
887
|
2 |
3 |
2 |
|
2 |
3 |
2 |
|
2 |
1 |
4 |
|
3 |
5 |
1 |
|
3 |
4 |
2 |
|
3 |
2 |
3 |
|
3 |
2 |
3 |
|
3 |
2 |
3 |
|
3 |
1 |
6 |
+------+------+------+
10 rows in set

使用 DROP ROUTINE 语句从数据库中删除用户定义的例程
(UDR)。
该语句是 SQL ANSI/ISO 标准的扩展。
语法

元素
描述
限制
语法
owner
UDR 所有者的名

必须拥有 UDR
所有者名

parameter_type
routine 参数的
数据类型
数据类型(或数据类型列
表)必须与 UDR 定义中的数
据类型是相同类型(并且以
相同的顺序指定)
标识符;
数据类型
routine
要删除的 UDR
的名称
UDR 必须在数据库中存在
(即已注册)
标识符
用法
删除 UDR 会从数据库中除去 UDR 的文本和可执行的版本。如果不指定 UDR
是用户定义的函数还是用户定义的过程,则此语句指导服务器删除指定的用户定
义的函数或用户定义的过程。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 579
要使用 DROP ROUTINE 语句,您必须是 UDR 的所有者(并且持有数据库的
Resource 特权),或者您必须具有 DBA 特权。您还必须持有编写此 UDR 的程
序语言的 Usage 特权。要删除外部的用户定义的例程,请参阅删除外部例程.。
限制
您无法从相同的 SPL 例程内删除 SPL 例程。
您不能使用 DROP ROUTINE 、DROP FUNCTION 或 DROP PROCEDURE 语句
删除受保护的例程。有关受保护例程的更多信息,请参阅 GBase 8s SQL 参考指
南 中系统目录表 sysprocedures 的描述。
要使用 DROP ROUTINE 语句注销 UDR,UDR 的类型不能含糊不清。您指定的 UDR
的名称必须引用用户定义的函数或用户定义的过程。如果存在以下任何一个条
件,则数据库服务器会返回一个错误:

您指定的名称(或参数)同时应用于用户定义的过程和用户定义的函数。

您指定的 specific 名称同时应用于用户定义的过程和用户定义的函数。
如果例程名称在数据库内不唯一,则您必须指定足够的 parameter_type 信息以区
分这些名称。如果数据库服务器无法解析一个意义含糊的 UDR 名称,即它的签
名与另一个 UDR 的签名只是在一个未命名的 ROW 类型参数中不同,则返回一
个错误。(当定义了含义模糊的 function 或 procedure 时,数据库服务器不能预
期此错误。)
如果使用参数类型来标识 UDR,则这些参数数据类型应跟在 UDR 名称后面,如下
例所示:
DROP ROUTINE compare(INT, INT);
如果您对 UDR 使用特定的名称,则必须包含关键字 SPECIFIC ,如下例所示:
DROP SPECIFIC ROUTINE compare_point;
如果您包含了可选的 IF EXISTS 关键字,则如果数据库服务器在当前数据库中没
有找到与 DROP ROUTINE 语句指定的相符合的函数则数据库不采取任何操作
(而不是发出错误)。
确定例程是否存在

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 580
在您尝试删除用户定义的例程之前,可以通过查询系统目录来检查此例程是否在
数据库中存在。以下示例中,SELECT 语句从 sysprodures 表中检索标识为
MyRoutine 的任何例程:
SELECT * FROM sysprocedures WHERE procname = MyRoutine;

如果此查询返回一行,则名为 MyRoutine 的 UDR 注册在当前数据库中。
如果没有返回行,则您无需发出 DROP ROUTINE 语句,但是您可能希望验证
WHERE 子句指定的名称是否正确,以及您是否连接到正确的数据库。
如果此查询返回多行,则在当前数据库中重载例程 MyRoutine ,并且您需要检
查 MyRoutine 例程的属性以确定它们中的哪些(如果有)需要通过 DROP
ROUTINE 语句注销。
删除外部例程
以 C 语言或 Java™ 语句编写用户定义的例程(UDR)称为外部例程。外部例程
必须包含指定共享对象文件名的外部例程引用子句。在缺省情况下,只有 DBSA
授予了内置的 EXTEND 角色的用户可以创建或删除外部例程。您还必须具有编
写此 UDR 的外部程序语言的 Usage 特权。有关 EXTEND 角色安全功能的其它
信息请参阅 授予 EXTEND 角色。有关 C 语言或 Java 语言的 USAGE ON
LANGUAGE 子句的语法使用,请参阅 语言级权限 。
要从共享内存中删除 C 语言例程的可执行版本,请调用
IFX_UNLOAD_MODULE 函数。要用另一个例程替换可执行版本的 C 例程,请
调用 IFX_REPLACE_MODULE 函数。这些内置函数都在 UDR 定义例程中有
所描述。