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

相关文章

  • 深入解析NoSQL数据库的分布式算法(图文详解)

    深入解析NoSQL数据库的分布式算法(图文详解)

    这篇文章主要介绍了深入解析NoSQL数据库的分布式算法,需要的朋友可以参考下
    2015-12-12
  • PostgreSQL8.3.3安装方法

    PostgreSQL8.3.3安装方法

    非安装版的PostgreSQL8.3.3的首次使用经历第一次用Postgre,已经是好多年以前了,隐约记得是在linux下边,build半天,然后手动配置库文件之类。
    2008-09-09
  • Doris 数据模型ROLLUP及前缀索引官方教程

    Doris 数据模型ROLLUP及前缀索引官方教程

    本文档主要从逻辑层面,描述 Doris 的数据模型 ROLLUP 以及前缀索引的概念,以帮助用户更好的使用 Doris 应对不同的业务场景,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Linux下mysql数据库的创建导入导出 及一些基本指令

    Linux下mysql数据库的创建导入导出 及一些基本指令

    这篇文章主要介绍了Linux数据库的创建 导入导出 以及一些基本指令,需要的朋友可以参考下
    2019-08-08
  • Doris Join 优化原理文档详解

    Doris Join 优化原理文档详解

    这篇文章主要为大家介绍了Doris Join 优化原理文档详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • sqlsever2019文件创建与变量示例

    sqlsever2019文件创建与变量示例

    大家好,本篇文章主要讲的是sqlsever2019文件创建与变量示例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • SQL注入原理与解决方法代码示例

    SQL注入原理与解决方法代码示例

    这篇文章主要介绍了SQL注入原理与解决方法代码示例,小编觉得还是挺不错的,这里分享给大家,供需要的朋友参考。
    2017-10-10
  • 连续序号的 sql语句

    连续序号的 sql语句

    连续序号的 sql语句,大家可以参考下,修改成自己的语句。
    2009-06-06
  • 如何在Navicat新建连接、新建数据库以及导入数据库

    如何在Navicat新建连接、新建数据库以及导入数据库

    Navicat是图形化操作MySQL的强大工具,但是当数据库的服务器没有开放3306端口给办公网络时,在办公网使用navicat连接数据库是连不上的,下面这篇文章主要给大家介绍了关于如何在Navicat新建连接、新建数据库以及导入数据库的相关资料,需要的朋友可以参考下
    2023-05-05
  • 使用navicat连接虚拟机的数据库进行操作详细流程

    使用navicat连接虚拟机的数据库进行操作详细流程

    这篇文章主要给大家介绍了关于使用navicat连接虚拟机的数据库进行操作详细流程,使用Navicat连接虚拟机的数据库,需要确保虚拟机和数据库运行状态,获取数据库信息,包括类型、IP地址、端口号、用户名和密码,需要的朋友可以参考下
    2024-11-11

最新评论