RANK
📄字数 770
👁️阅读量 加载中...
功能描述
为有序结果集中的每一行分配一个排名,排名并列时,将并列数加到排名上用于计算下一个排名,所以排名有可能不是一个连续的值。
语法格式
sql
RANK() OVER(analytic_clause)
输入参数
analytic_clause
:分析子句,支持分组子句,排序子句以及范围子句,其中排序子句是必须项,分析子句的详细说明请参考 analytic_clause。
提示
PARTITION BY
:可选,按列分区(如 deptno),每个分区独立排名。ORDER BY
:指定排序依据(如 price DESC),决定排名顺序。
输出结果
输出结果为INTEGER
类型,当数据存在重复值时,它会为相同值分配并列名次,并自动跳过后续名次(例如:[100, 100, 90]的排名结果为[1, 1, 3])。
示例
SQL
-- 创建示例表
SQL> CREATE TABLE sal_info(id INT IDENTITY(1,1),name VARCHAR,deptno INT,sal NUMERIC(10,2));
-- 插入数据到示例表
SQL> INSERT INTO sal_info VALUES(DEFAULT,'张三',10,5000);
SQL> INSERT INTO sal_info VALUES(DEFAULT,'李四',10,5500);
SQL> INSERT INTO sal_info VALUES(DEFAULT,'王五',10,4500);
SQL> INSERT INTO sal_info VALUES(DEFAULT,'赵六',10,4800);
-- 查询数据
SQL> SELECT *,RANK() OVER(PARTITION BY deptno ORDER BY sal) rk FROM sal_info ORDER BY deptno,rk;
+----+------+--------+------+----+
| ID | NAME | DEPTNO | SAL | RK |
+----+------+--------+------+----+
| 3 | 王五 | 10 | 4500 | 1 |
| 4 | 赵六 | 10 | 4800 | 2 |
| 1 | 张三 | 10 | 5000 | 3 |
| 2 | 李四 | 10 | 5500 | 4 |
+----+------+--------+------+----+
扩展
- 为相同值分配相同的排名,且分配连续的排名,请参考函数 DENSE_RANK()。
- 为相同值分配不同的排名,请参考函数 ROW_NUMBER()。