数据库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()分组排序函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!