MYSQL(排序):Rank() over()的用法

本文详细介绍了SQL中的排名函数rank()的使用方法,包括如何在整个结果集中进行排名,以及如何在分组后的数据中进行排名。通过具体实例展示了不同场景下rank()函数的应用,如按单个字段排名、按多个字段分组排名以及在分组内按特定字段排名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:https://www.cnblogs.com/mycoding/archive/2010/05/29/1747065.html

创建一个test表,并插入6条数据。
CREATE TABLE test

(
a INT,
b INT,
c CHAR
)
INSERT INTO test VALUES(1,3,‘E’)
INSERT INTO test VALUES(2,4,‘A’)
INSERT INTO test VALUES(3,2,‘D’)
INSERT INTO test VALUES(3,5,‘B’)
INSERT INTO test VALUES(4,2,‘C’)
INSERT INTO test VALUES(2,4,‘B’)

SELECT * from test
a           b           c
----------- ----------- ----
1           3           E
2           4           A
3           2           D
3           5           B
4           2           C
2           4           B

(6 行受影响)

1、整个结果集是一个分组,以a进行排名
SELECT a,b,c,rank () OVER (ORDER BY a) rank FROM test
a           b           c    rank
----------- ----------- ---- --------------------
1           3           E    1
2           4           A    2
2           4           B    2
3           2           D    4
3           5           B    4
4           2           C    6

(6 行受影响)
2、整个结果集是一个分组,以b进行排名
SELECT a,b,c,rank () OVER (ORDER BY b) rank FROM test
a           b           c    rank
----------- ----------- ---- --------------------
3           2           D    1
4           2           C    1
1           3           E    3
2           4           A    4
2           4           B    4
3           5           B    6

(6 行受影响)
3、以a,b进行分组,在每个组内以b进行排名。分了5个组,第2行跟第3行是一个组,其他的每行是一个组。在第2行与第3行的组内以b排名,并列为1
SELECT a,b,c,rank () OVER (PARTITION BY a,b ORDER BY b) rank FROM test
a           b           c    rank
----------- ----------- ---- --------------------
1           3           E    1
2           4           A    1
2           4           B    1
3           2           D    1
3           5           B    1
4           2           C    1

(6 行受影响)
4、以a,b进行分组,在每个组内以c进行排名。分了5个组,第2行跟第3行是一个组,其他的每行是一个组。在第2行与第3行的组内以c排名,由于c列一个是A,一个是B,所以Rank分别为1、2。
SELECT a,b,c,rank () OVER (PARTITION BY a,b ORDER BY c) rank FROM test
a           b           c    rank
----------- ----------- ---- --------------------
1           3           E    1
2           4           A    1
2           4           B    2
3           2           D    1
3           5           B    1
4           2           C    1

(6 行受影响)

总结:1、partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组。

2、Rank 是在每个分组内部进行排名的。

rank over,partition,sql

### 关于 MySQL Workbench 中 RANK 函数的使用 在 MySQL 8.0 及更高版本中,`RANK()` 是一种窗口函数,用于为结果集中每一行分配一个排名值[^2]。如果需要在 MySQL Workbench 中正确使用 `RANK()` 函数,则需确保数据库服务器运行的是支持窗口函数的 MySQL 版本(即 MySQL 8.0 或以上)。以下是关于如何正确使用 `RANK()` 的说明: #### 数据库版本确认 首先应验证当前使用的 MySQL 是否满足最低版本要求。可以通过以下 SQL 查询来检查版本号: ```sql SELECT VERSION(); ``` 只有当返回的结果显示版本号大于等于 8.0 时,才能正常使用 `RANK()` 等窗口函数。 #### 使用语法 `RANK()` 函数的基本语法如下所示: ```sql RANK() OVER (PARTITION BY column_name ORDER BY column_name) ``` - **OVER 子句**:定义了一个逻辑分区或整个数据集作为窗口范围,在此范围内应用排名操作。 - **PARTITION BY**:可选参数,指定按哪些字段分组进行排名计算;如果不提供,默认在整个结果集上执行排名。 - **ORDER BY**:必填项,指定了按照哪个字段排序来进行排名运算。 下面是一个具体的例子展示如何利用 `RANK()` 来获取员工工资等级列表并为其赋予相应的名次编号: ```sql SELECT employee_id, department_id, salary, RANK() OVER(PARTITION BY department_id ORDER BY salary DESC) AS rank_num FROM employees; ``` 在此查询语句里,我们先依据部门 ID 对雇员们进行了划分(`PARTITION BY`),然后再基于薪资水平降序排列每位成员的位置(`ORDER BY`),最后借助 `RANK()` 方法给予他们对应的位阶标签 (`rank_num`)[^4]。 值得注意的一点是,如果有两个或者更多条目拥有相同的数值(比如相同薪水),那么这些重复项目将会被授予同样的排名号码,并且下一个可用位置会跳过相应数量以便保持连续性[^3]。 #### 常见错误排查 假如尝试执行包含 `RANK()` 的脚本却遭遇失败提示诸如“FUNCTION database.RANK does not exist”,这通常意味着本地安装的 MySQL 实例尚未升级到兼容窗口功能的新版之上。此时应当考虑更新至最新稳定发行版以解锁全部特性支持。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值