返回首页

gbase数据、南大通用产品文档:GBase8aRANK OVER 函数

更新日期:2024年09月11日

语法
RANK() OVER([PARTITION BY col_name1,col_name2,…] ORDER BY col_name1 [ASC/DESC],
col_name2 [ASC/DESC],…)
功能描述
根据ORDER BY 子句中表达式的值,从查询返回的每一行计算它们与其它行的相
对位置。组内的数据按ORDER BY 子句排序,然后给每一行赋一个号,从而形成
一个序列,该序列从1 开始,往后累加。

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 578
每次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

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 内部中使用外部引用:
SELECT * FROM t1 WHERE i IN (SELECT RANK () OVER(ORDER BY t1.k)
FROM t2);-- error

RANK 函数不得在DELETE 和UPDATE 语句的非查询部分:

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 579
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 desc) AS rank FROM t1;
+------+------+------+
| i | j | rank |
+------+------+------+
| 2 | 5 | 1 |
| 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

关键字 SET 之后的每一赋值都为列指定新的值。
那个值统一地应用于您更新的每一行。

前面部分中的示例中,新的值为常量,但您可指定任意表达式,包括基于列值本身的表达
式。假设制造商 HRO 已将所有价格提高百分之五,且您必须更新 stock 表来反映此提价。
请使用下列语句:
UPDATE stock
SET unit_price = unit_price * 1.05
WHERE manu_code = 'HRO';
您还可使用子查询作为指定的值的一部分。当使用子查询作为表达式的元素时,它必须恰
好返回一个值(一列和一行)。对于任何库存编号,或许您决定必须收取比那种产品的任
何制造商都更高的价格。
您需要更新所有未装运的订单的价格。
下列示例中的 SELECT 语
句指定该标准:
UPDATE items
SET total_price = quantity *
(SELECT MAX (unit_price) FROM stock
WHERE stock.stock_num = items.stock_num)
WHERE items.order_num IN
(SELECT order_num FROM orders

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 172 -

WHERE ship_date IS NULL);
第一个 SELECT 语句返回单个值:在 stock 表中,对于某个特定的产品的最高价格。第一
个 SELECT 语句是一个相关联的子查询,
因为当来自items 的值出现在第一个 SELECT 语
句的 WHERE 子句中时,您必须为您更新的每一行都执行该查询。
第二个 SELECT 语句产生未装运的订单的订单编号的一个列表。
它是一个执行一次的非相
关的子查询。

选中VC 名称、
选中数据库名称,
即可展示出当前已有权限。
可以再次选中
别的权限或者取消选中,点击确定即可将数据保存。

统一数据平台监控与运维系统用户手册
- 154 -
南大通用数据技术股份有限公司