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

 更新时间:2024年11月18日 11:33:53   作者:五月天的尾巴  
RANK()是MySQL数据库中的一个窗口函数,它可以根据指定的排序列对数据进行排序,并为相同的值分配相同的排名,文中通过示例代码介绍的非常详细,感兴趣的可以了解一下

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

相关文章

  • SQL语句优化之JOIN和LEFT JOIN 和 RIGHT JOIN语句的优化

    SQL语句优化之JOIN和LEFT JOIN 和 RIGHT JOIN语句的优化

    在数据库的应用中,我们经常需要对数据库进行多表查询,然而当数据量非常大时多表查询会对执行效率产生非常大的影响,因此我们在使用JOIN和LEFT JOIN 和 RIGHT JOIN语句时要特别注意
    2018-03-03
  • 当数据库变慢时的解决方法

    当数据库变慢时的解决方法

    当数据库变慢时,我们应如何入手,下面的解决方法。
    2009-04-04
  • 如何利用SQL语句创建数据库详解

    如何利用SQL语句创建数据库详解

    数据库就是一个文件系统,访问数据的时候需要通过标准的SQL语言来完成,下面这篇文章主要给大家介绍了关于如何利用SQL语句创建数据库的相关资料,需要的朋友可以参考下
    2022-06-06
  • 手动部署OceanBase三副本集群方式

    手动部署OceanBase三副本集群方式

    这篇文章主要介绍了手动部署OceanBase三副本集群方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 详解分库分表后非分片键如何查询

    详解分库分表后非分片键如何查询

    这篇文章主要为大家介绍了分库分表后非分片键如何查询详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 虚拟主机ACCESS转换成MSSQL完全攻略(图文教程)

    虚拟主机ACCESS转换成MSSQL完全攻略(图文教程)

    大家都知道,ACCESS数据库在数据量到达一定程度后,访问速度会明显变慢,甚至造成崩溃。目前,大多数虚拟主机服务商提供的ASP主机空间一般都同时支持MS ACCESS和MS SQL两种类型的数据库。
    2010-04-04
  • 如何用分表存储来提高性能 推荐

    如何用分表存储来提高性能 推荐

    如何用分表存储来提高性能 ,需要的朋友可以参考下。
    2011-09-09
  • Hive HQL支持2种查询语句风格

    Hive HQL支持2种查询语句风格

    这篇文章主要为大家介绍了Hive HQL支持2种查询语句风格示例语法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • MyBatis获取数据库自生成的主键Id详解及实例代码

    MyBatis获取数据库自生成的主键Id详解及实例代码

    这篇文章主要介绍了MyBatis获取数据库自生成的主键Id详解及实例代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • 图文详解HTTP头中的SQL注入

    图文详解HTTP头中的SQL注入

    HTTP头字段是超文本传输协议(HTTP)中请求和响应的部分信息,它们定义了HTTP传输的操作参数,下面这篇文章主要给大家介绍了关于HTTP头中SQL注入的相关资料,需要的朋友可以参考下
    2021-12-12

最新评论