语法
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