Rank() over()的用法

创建一个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用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组。

### SQL 中 `RANK() OVER()` 函数的用法 `RANK() OVER()` 是一种窗口函数,广泛应用于数据库管理系统(如 SQL Server 和 Oracle),用于为查询结果集中的每一行分配排名。以下是关于其功能和使用的详细介绍: #### 1. 基本语法 `RANK()` 的基本语法如下: ```sql RANK() OVER ([PARTITION BY column_name] ORDER BY column_name [ASC | DESC]) ``` - **`PARTITION BY`**: 可选参数,用于将数据划分为多个逻辑分组,在每个分组内独立计算排名[^4]。 - **`ORDER BY`**: 必需参数,指定按哪个列进行排序以及排序的方向(升序 `[ASC]` 或降序 `[DESC]`)。如果没有提供方向,默认为升序。 #### 2. 功能特点 - 当存在相同值时,`RANK()` 会给这些记录分配相同的排名,并且会跳过后续的排名编号。例如,如果有两条记录并列为第 1 名,则下一条记录会被标记为第 3 名,而不会有第 2 名[^1]。 #### 3. 实际应用案例 假设有一个名为 `Employees` 的表,其中包含员工姓名 (`Name`)、部门 (`Department`) 和工资 (`Salary`) 字段。我们希望根据薪资水平对各部门内部的员工进行排名。 ##### 查询语句 ```sql SELECT Name, Department, Salary, RANK() OVER (PARTITION BY Department ORDER BY Salary DESC) AS Rank_Salary FROM Employees; ``` - **解释**: - 使用 `PARTITION BY Department` 将数据按部门划分成若干子集。 - 对于每一个部门,通过 `ORDER BY Salary DESC` 按照薪水从高到低排列。 - 结果集中新增一列 `Rank_Salary` 表示每名员工在其所在部门内的薪资排名。 #### 4. 示例输出 假设有以下原始数据: | Name | Department | Salary | |----------|------------|--------| | Alice | HR | 7000 | | Bob | IT | 9000 | | Charlie | IT | 8500 | | Diana | HR | 7000 | 执行上述查询后得到的结果可能是这样的: | Name | Department | Salary | Rank_Salary | |----------|------------|--------|-------------| | Alice | HR | 7000 | 1 | | Diana | HR | 7000 | 1 | | Bob | IT | 9000 | 1 | | Charlie | IT | 8500 | 2 | 注意:由于 Alice 和 Diana 薪资相等,因此它们共享排名第 1;HR 部门中没有其他更高或更低薪金的人,所以不存在进一步的排名变化。 #### 5. 与其他排名函数的区别 除了 `RANK()` 外,还有两种常见的排名函数——`DENSE_RANK()` 和 `ROW_NUMBER()`。三者的主要差异在于对待重复值的方式上: - 如果两行具有相同的值,`RANK()` 会产生跳跃式的排名; - `DENSE_RANK()` 同样给予相同值一致的排名,但它不会遗漏任何整数作为下一个可能的等级[^2]; - `ROW_NUMBER()` 总是返回唯一的连续数值列表,即使某些条目之间可能存在平局情况也不会改变这一特性。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值