详情

首页手游攻略 数据库rank()分组排序函数的具体使用实用指南

数据库rank()分组排序函数的具体使用实用指南

佚名 2026-09-10 09:10:01

平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“数据库rank()分组排序函数的具体采用”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。

目录
  • 一、rank()函数
  • 二、采用案例
    • 2.1、按成绩进行排名
    • 2.2、拿到排名前五的数据
    • 2.3、分组后再排名
  • 三、总结
    • 3.1、row_number()、rank() 和 dense_rank() 的区别

结合项目来看,RANK()是MySQL数据库提供的一个窗口函数,用来对查询结果进行排序同时为每个行分配排名。它能够根据指定的排序列对数据进行排序,并得到唯一的排名值。

mysql、oracle、hive都兼容rank()函数

一、rank()函数

RANK(): 用来对结果集中的行进行排名。RANK() 会为相同的值分配相同的排名,并在随后排名中跳过相应的名次。 比如有两个同时列第一,则前两名的排名都是1,第三个人的排名是3。

语法结构:

RANK() OVER (
    PARTITION BY <expression>[{,<expression>...}]
    ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
)

实际处理时,PARTITION BY子句对结果集进行分区。RANK()功能在分区内执行;ORDER BY子句按一个或多个列或表达式对分区内的行进行排序。

理解这一步时,注意,over()里头的分组以及排序的执行晚于 where、group by、 order by 的执行。

二、采用案例

数据准备:

create table `student`(
    id int(10) not null primary key,
    name varchar(20) not null,
    score int(10) not null
);

insert into `student` values(1,'a',100);
insert into `student` values(2,'b',100);
insert into `student` values(3,'c',95);
insert into `student` values(4,'d',95);
insert into `student` values(5,'e',95);
insert into `student` values(6,'a',90);
insert into `student` values(7,'a',89);

表数据:

2.1、按成绩进行排名

select *,rank() over(order by score desc) as `rank` from `student`;

两个并列第一名后,下一个是第三名。

上图中over中没有采用partition进行分组,默认都是同一组

2.2、拿到排名前五的数据

select * from (
  select name, score, rank() over (order by score desc) as `rank`
  from `student`
) a where `rank` <=5;

2.3、分组后再排名

select name,score,rank() over(partition by name order by score desc) as `rank`
from `student`;

首先,PARTITION BY子句按姓名将结果集分成多个分区。

然后,ORDER BY子句按分数对结果集进行排序。

三、总结

落到代码里,在数据分析里,ROW_NUMBER()、RANK() 和 DENSE_RANK() 是很有用的工具。它们能够帮助用户更快对数据进行排名和分类分析。虽然这三种函数的作用相似,但因其在处理重复值时的行为不同,所以在采用时需根据具体需求进行选择。

3.1、row_number()、rank() 和 dense_rank() 的区别

  • ROW_NUMBER():为每一行分配唯一的行号,适合唯一标识需求。
  • RANK():为重复值分配相同的排名,同时在后续排名中跳过名次,适合需处理排名的场景。
  • 实际处理时,DENSE_RANK():为重复值分配相同的排名,但不跳过名次,适合希望连续排名的场景。

下面表格总结了这三个函数的主要区别:

函数特点排名示例
ROW_NUMBER为每行分配唯一的数字1, 2, 3, 4, ……
RANK相同的值共享相同的排名,排名会跳过数字1, 1, 3, 4, ……
DENSE_RANK相同的值共享相同的排名,不跳过数字1, 1, 2, 3, ……

具体请参考《row_number() over (partition by 分组列 order by 排序列 desc)、row_number() 函数、分组排序函数》、《dense_rank() 函数的采用》、《row_number()、rank() 和 dense_rank() 的区别、分组排序函数》

到此这篇关于数据库rank()分组排序函数的具体采用的文章就介绍到这了,更多相关数据库rank()分组排序函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!

您可能感兴趣的文章:

  • MySQL之dense_rank()分组排序函数的采用

相关资讯
点击查看更多
游戏推荐
推荐专题
热门阅读
推荐下载