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

 更新时间:2024年11月18日 11:36:03   作者:五月天的尾巴  
DENSE_RANK()是一种窗口函数,用于在数据库中计算密集等级,本文就来介绍一下MySQL之dense_rank()分组排序函数的使用,感兴趣的可以了解一下

DENSE_RANK()是一种窗口函数,用于在数据库中计算密集等级。它为每个行分配一个密集等级,并根据指定的排序顺序进行排列。比如:如果有两个排名为1的值,接下来的值将会被标记为2,而不是3。

一、dense_rank() 函数

DENSE_RANK() 也是一个窗口函数,用于为结果集中的每一行分配排名。DENSE_RANK() 在遇到相同的排序值时,会为相同的行分配相同的排名,并且下一个排名不会跳过。换句话说,如果有两个排名为1的值,接下来的值将会被标记为2,而不是3。

语法结构:

DENSE_RANK() OVER (
    PARTITION BY <expression>[{,<expression>...}]
    ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
) 
  • PARTITION BY:用于将结果集分区,针对每个分区单独排名。
  • 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 *,dense_rank() over(order by score desc) as dr from `student`;

两个并列第一名后,下一个是第二名,不会跳过排名。

在这里插入图片描述

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

2.2、获取排名前五的数据

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

在这里插入图片描述

2.3、分组后再排名

select name,score,dense_rank() over(partition by name order by score desc) as dr
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() 函数、分组排序函数》、《数据库rank()分组排序函数详解》、《row_number()、rank() 和 dense_rank() 的区别、分组排序函数

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

相关文章

  • MySQL之Explain详解

    MySQL之Explain详解

    使用Explain关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈,感兴趣的的同学可以参考阅读
    2023-04-04
  • Windws MySQL 8.4 LTS的安装

    Windws MySQL 8.4 LTS的安装

    本文主要介绍了Windws MySQL 8.4 LTS的安装,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • MySQL的指定范围随机数函数rand()的使用技巧

    MySQL的指定范围随机数函数rand()的使用技巧

    这篇文章主要介绍了MySQL的指定范围随机数函数rand()的使用技巧,需要的朋友可以参考下
    2016-09-09
  • MySql创建带解释的表及给表和字段加注释的实现代码

    MySql创建带解释的表及给表和字段加注释的实现代码

    这篇文章主要介绍了MySql创建带解释的表以及给表和字段加注释的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-12-12
  • mysql密码忘记后如何修改密码(2022年最新版详细教程保姆级)

    mysql密码忘记后如何修改密码(2022年最新版详细教程保姆级)

    因为长时间不操作mysql而忘记root密码的朋友估计不在少数,下面这篇文章主要给大家介绍了关于mysql密码忘记后如何修改密码的相关资料,本教程是2022年最新版详细教程保姆级,需要的朋友可以参考下
    2022-04-04
  • MySQL count(1)、count(*)、count(字段)的区别

    MySQL count(1)、count(*)、count(字段)的区别

    COUNT在数据库行数统计中被广泛使用,那么你知道MySQL count(1)、count(*)、count(字段)的区别吗,本文就想的介绍一下,感兴趣的可以了解一下
    2021-12-12
  • Mysql中校对集utf8_unicode_ci与utf8_general_ci的区别说明

    Mysql中校对集utf8_unicode_ci与utf8_general_ci的区别说明

    一直对utf8_unicode_ci与utf8_general_ci这2个校对集很迷惑,今天查了手册有了点眉目。不过对中文字符集来说采用utf8_unicode_ci与utf8_general_ci时有何区别还是不清楚
    2012-03-03
  • 如何使Mysql自动生成序号列,序号自动增长问题

    如何使Mysql自动生成序号列,序号自动增长问题

    这篇文章主要介绍了如何使Mysql自动生成序号列,序号自动增长问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • SQL中笛卡尔积的实际应用

    SQL中笛卡尔积的实际应用

    笛卡尔积算法,又称为笛卡尔积枚举法,是一种枚举算法,用于在两个或多个集合之间枚举所有可能的组合,这篇文章主要给大家介绍了关于SQL中笛卡尔积的相关资料,需要的朋友可以参考下
    2023-03-03
  • MySQL数据库wait_timeout参数详细介绍

    MySQL数据库wait_timeout参数详细介绍

    这篇文章主要介绍了MySQL数据库wait_timeout参数详细介绍的相关资料,wait_timeout是MySQL中用于控制非交互式连接等待时间的系统变量,影响服务器资源管理和安全性,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-12-12

最新评论