SQL中生成RANK的几种方法

本文详细介绍了SQL中的row_number、rank和dense_rank函数,分别用于生成有序序列和处理并列排名。row_number为每行提供唯一序号,rank在遇到相同值时会跳过排名,而dense_rank则保证排名连续。通过实例展示了这些函数在学生分数排序和数据分组中的应用,帮助读者深入理解数据库查询中的排名操作。

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

row_number:用途非常广泛,排序最好用它,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号。

rank:用于返回结果集的分区内每行的排名,行的排名是相关行之前的排名数加一。简单来说rank函数就是对查询出来的记录进行排名,与row_number函数不同的是,rank函数考虑到了over子句中排序字段值相同的情况,如果使用rank函数来生成序号,over子句中排序字段值相同的序号是一样的,后面字段值不相同的序号将跳过相同的排名号排下一个,也就是相关行之前的排名数加一,可以理解为根据当前的记录数生成序号,后面的记录依此类推。
例如:1 1 3 3 5 5,可见并不会出现第二名,第四名这样的情况。

#按照课程对学生的成绩进行排序:
select name,course,row_number() over(partition by course order by score desc) rank from student;

dense_rank:函数的功能与rank函数类似,dense_rank函数在生成序号时是连续的,而rank函数生成的序号有可能不连续。dense_rank函数出现相同排名时,将不跳过相同排名号,rank值紧接上一次的rank值。在各个分组内,rank()是跳跃排序,有两个第一名时接下来就是第三名,dense_rank()是连续排序,有两个第一名时仍然跟着第二名。
例如:1 1 2 2 3 3…第二名仍然会出现

#LeetCode上的一道题目

select score,dense_rank() over(order by score desc) as 'rank' from scores order by score desc;

select s1.score, count(distinct s2.score) 'rank'
from scores s1
inner join
scores s2
on s1.score<=s2.score
group by s1.id
order by s1.score desc;

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

#以a,b字段进行分组,在分组内按照C进行排序
SELECT a,b,c,rank () OVER (PARTITION BY a,b ORDER BY c) rank FROM test
### SQLRANK 函数的使用说明 #### 定义与功能 `RANK()` 是一种窗口函数,在 SQL 查询中用于为结果集中的每一行分配一个排名值。该排名基于指定的 `ORDER BY` 子句定义的顺序,当存在相同值时会生成相同的排名,并且后续排名会跳跃以反映重复项的数量[^1]。 #### 基本语法 以下是 `RANK()` 的通用语法: ```sql RANK() OVER ( [PARTITION BY 分组列] ORDER BY 排序列 [ASC | DESC] ) ``` - **PARTITION BY**: 可选参数,用于将数据划分为多个分区,每个分区内独立计算排名。 - **ORDER BY**: 必需参数,定义排名依据的字段及其排序方式(升序或降序)。 --- #### 示例 1:基本排名 假设有一个名为 `employees` 的表,包含以下数据: | employee_id | department | salary | |-------------|------------|--------| | 1 | HR | 5000 | | 2 | IT | 7000 | | 3 | IT | 8000 | | 4 | HR | 6000 | 执行如下查询: ```sql SELECT employee_id, department, salary, RANK() OVER (ORDER BY salary DESC) AS rank_value FROM employees; ``` 返回的结果将是: | employee_id | department | salary | rank_value | |-------------|------------|--------|------------| | 3 | IT | 8000 | 1 | | 2 | IT | 7000 | 2 | | 4 | HR | 6000 | 3 | | 1 | HR | 5000 | 4 | 此示例展示了如何按薪资降序排列并赋予每条记录相应的排名[^2]。 --- #### 示例 2:带 PARTITION BY 的排名 如果希望按照部门对员工进行排名,则可以加入 `PARTITION BY` 子句。例如: ```sql SELECT employee_id, department, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_value FROM employees; ``` 得到的结果如下: | employee_id | department | salary | rank_value | |-------------|------------|--------|------------| | 1 | HR | 5000 | 2 | | 4 | HR | 6000 | 1 | | 2 | IT | 7000 | 2 | | 3 | IT | 8000 | 1 | 这里可以看到,HR 和 IT 部门分别进行了内部排名[^3]。 --- #### 并列排名处理 当两个或更多行具有相同的排序键值时,它们会被赋予相同的排名,而下一个排名则会跳过相应数量的位置。例如,在上述例子中,如果有两名员工拥有完全一致的薪水,则他们的排名相同,下一排名自动增加一步跨度。 --- #### 应用场景 `RANK()` 函数广泛应用于数据分析领域,尤其是在需要识别前 N 名次或者分析分布情况的时候非常有用。比如找出公司里收入最高的几位雇员、统计考试成绩排行榜等等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值