翼度科技»论坛 编程开发 mysql 查看内容

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

9

主题

9

帖子

27

积分

新手上路

Rank: 1

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

一、dense_rank() 函数

DENSE_RANK() 也是一个窗口函数,用于为结果集中的每一行分配排名。DENSE_RANK() 在遇到相同的排序值时,会为相同的行分配相同的排名,并且下一个排名不会跳过。换句话说,如果有两个排名为1的值,接下来的值将会被标记为2,而不是3。
语法结构:
  1. DENSE_RANK() OVER (
  2.     PARTITION BY <expression>[{,<expression>...}]
  3.     ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
  4. )
复制代码

  • PARTITION BY:用于将结果集分区,针对每个分区单独排名。
  • ORDER BY:指定排序的列,决定了排名的依据。
注意,over()里头的分组以及排序的执行晚于 where 、group by、 order by 的执行。

二、使用案例

数据准备:
  1. create table `student`(
  2.     id int(10) not null primary key,
  3.     name varchar(20) not null,
  4.     score int(10) not null
  5. );

  6. insert into `student` values(1,'a',100);
  7. insert into `student` values(2,'b',100);
  8. insert into `student` values(3,'c',95);
  9. insert into `student` values(4,'d',95);
  10. insert into `student` values(5,'e',95);
  11. insert into `student` values(6,'a',90);
  12. insert into `student` values(7,'a',89);
复制代码
表数据:


2.1、按成绩进行排名
  1. select *,dense_rank() over(order by score desc) as dr from `student`;
复制代码
两个并列第一名后,下一个是第二名,不会跳过排名。
  1. 上图中over中没有使用partition进行分组,默认都是同一组
复制代码
2.2、获取排名前五的数据
  1. select * from (
  2.   select name, score, dense_rank() over (order by score desc) as dr
  3.   from `student`
  4. ) a  where `dr` <=5;
复制代码


2.3、分组后再排名
  1. select name,score,dense_rank() over(partition by name order by score desc) as dr
  2. 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()分组排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/database/330889rfr.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具