数据库中row_number()、rank() 和 dense_rank() 的区别 |
||||||||||||
在数据分析和处理的过程中,尤其是在使用 SQL 进行查询时,排名函数(Ranking Functions)是一个非常重要的工具 。Apache Hive 和其他数据库系统都提供了一些排名函数,常见的包括 ROW_NUMBER()、RANK() 和 DENSE_RANK() 。虽然这三个函数都可以用于为结果集中的行分配一个排名,但它们的工作原理和返回结果却各不相同 。本文将深入探讨这三个函数的区别、使用场景以及实例演示 。 ROW_NUMBER()、RANK() 和 DENSE_RANK()是排名函数,也叫分组排序函数 。即可以对查询结果集进行分组后进行排序,对结果集的每一行分配一个编号 。例如:对考试成绩按科目进行分组,然后按分数排序,获取前5名 。 ROW_NUMBER()、RANK() 和 DENSE_RANK()这三个函数在mysql8.0、hive、oracle都是支持的 一、函数定义1.1、ROW_NUMBER()ROW_NUMBER() 函数用于 基本语法: ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY column2)
1.2、RANK()RANK() 函数与 ROW_NUMBER() 类似,也用于对结果集中的行进行排名,但在处理重复值时表现不同 。 基本语法: RANK() OVER (PARTITION BY column1 ORDER BY column2) 1.3、DENSE_RANK()DENSE_RANK() 函数也是用于排名的,其与 RANK() 的主要区别在于处理重复值时的行为 。 基本语法: DENSE_RANK() OVER (PARTITION BY column1 ORDER BY column2) 1.4、row_number()、rank() 和 dense_rank() 的区别
二、使用示例结合示例来看一下三者之间的区别,以下sql基于MySql8.0进行讲解 。 建表语句: create table test( id varchar(10) NOT NULL, `name` varchar(10) NULL, age varchar(10) NULL, salary int NULL ); -- 数据是每个人不同年龄段的薪资数据 insert into test(id,`name`,age,salary) values(1,'张三',24,15000); insert into test(id,`name`,age,salary) values(2,'李四',22,8000); insert into test(id,`name`,age,salary) values(3,'王五',20,6500); insert into test(id,`name`,age,salary) values(4,'赵六',23,15000); insert into test(id,`name`,age,salary) values(5,'孙七',22,8000); insert into test(id,`name`,age,salary) values(6,'周八',21,7500); 表数据: 以下是使用这三个函数的 SQL 查询示例: SELECT id, name, salary, ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn, RANK() OVER (ORDER BY salary DESC) AS `rank`, DENSE_RANK() OVER (ORDER BY salary DESC) AS `dense_rank` FROM test;
从上表可以看出:
三、总结在数据分析中,ROW_NUMBER()、RANK() 和 DENSE_RANK() 是非常有用的工具 。它们可以帮助用户快速对数据进行排名和分类分析 。虽然这三种函数的作用相似,但因其在处理重复值时的行为不同,所以在使用时需要根据具体需求进行选择 。 3.1、row_number()、rank() 和 dense_rank() 的区别
下面表格总结了这三个函数的主要区别:
具体请参考《row_number() over (partition by 分组列 order by 排序列 desc)、row_number() 函数、分组排序函数》、《数据库rank()分组排序函数详解》、《数据库dense_rank() 函数的使用、MySQL之dense_rank()、Hive之dense_rank()函数》 到此这篇关于数据库中row_number()、rank() 和 dense_rank() 的区别的文章就介绍到这了,更多相关row_number() rank() dense_rank()内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持! |