Hive 排名函数ROW_NUMBER、RANK()、DENSE_RANK等功能介绍、对比和举例

2024-01-30 14:28

本文主要是介绍Hive 排名函数ROW_NUMBER、RANK()、DENSE_RANK等功能介绍、对比和举例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1. ROW_NUMBER()

2. RANK()

3. DENSE_RANK()

4. NTILE()

5. CUME_DIST()

6. PERCENT_RANK()


1. ROW_NUMBER()

  功能:ROW_NUMBER() 函数为每个分组内的行提供唯一的序列号,从1开始。如果在 OVER() 子句中使用 ORDER BY 语句,它将根据指定的列值对行进行排序。

  对比

   每个行都会获得一个唯一的排名数字。
   即使两行的排序列值相同,它们也会获得连续的排名,不会有相同的排名值。

  举例: 

SELECT name, score, ROW_NUMBER() OVER (ORDER BY score DESC) as rank
FROM students;

  说明:假设 students 表包含学生的名字和分数。上述查询将根据分数降序排列学生,并为每个学生分配一个唯一的序列号作为排名。如果两个学生分数相同,他们将获得连续的排名编号。


2. RANK()

    功能:RANK() 函数在分组内为行提供排名,从1开始。如果两行或多行在 ORDER BY 子句中指定的排序列上的值相等,则它们将获得相同的排名,并且排名数字会跳过。

    对比

    如果有相同值的行,它们将共享相同的排名。
    在相同值的行之后的排名会跳过那些共享排名的行数。例如,如果有两行共享排名1,那么下一个排名将是3。

    举例:

SELECT name, score, RANK() OVER (ORDER BY score DESC) as rank
FROM students;

   说明:使用与 ROW_NUMBER() 相同的数据,RANK() 函数将为分数相同的学生分配相同的排名。如果两个学生的分数相同,他们将共享排名,例如都是排名1,下一个学生的排名将是3(假设只有两个学生分数相同)。


3. DENSE_RANK()

   功能:DENSE_RANK() 函数与 RANK() 函数类似,为分组内的行提供排名,但是它不会跳过排名数字。

   对比:

    与 RANK() 类似,相同值的行会获得相同的排名。
    不同于 RANK(),DENSE_RANK() 在相同值的行之后不会跳过排名数字。例如,如果有两行共享排名1,那么下一个排名将是2。

   举例:

SELECT name, score, DENSE_RANK() OVER (ORDER BY score DESC) as rank
FROM students;

   说明:使用与 RANK() 相同的数据,DENSE_RANK() 函数也会为分数相同的学生分配相同的排名。不同之处在于,它不会跳过排名,所以在上述例子中,下一个学生的排名将是2,而不是3。


4. NTILE()

   功能:NTILE() 函数将分组内的行分配到指定数量的桶中,并为每个行提供桶的编号。这对于数据分区和分布式处理很有用。

   对比

    NTILE() 用于更均匀地分配行到固定数量的桶中,而不是基于其值的排名。
    它更适合于当你需要将数据均匀地分成几部分时使用。

   举例:

SELECT name, score, NTILE(4) OVER (ORDER BY score DESC) as bucket
FROM students;

  说明:假设我们想要将学生根据分数高低分成4个桶。NTILE(4) 将学生分成四个组,每个组有相近数量的学生,并为每个学生分配一个桶编号。


5. CUME_DIST()

    功能CUME_DIST() 函数计算每个记录的累计分布百分比。这个函数返回一个介于 0 和 1 之间的值,表示小于或等于当前记录值的所有记录所占的比例。计算方式是 number of rows preceding or peer with the current row / total rows

    对比:

    这是一个统计函数,用于计算行在整体分布中的位置。
    它不提供排名,而是提供了每行相对于整个数据集的位置度量。

    举例:

SELECT name, score, CUME_DIST() OVER (ORDER BY score DESC) as cume_dist
FROM students;

  说明:这将计算每个学生的累积分布值。在上述查询中,每个学生的 cume_dist 值表示有多少比例的学生分数低于或等于该学生。在这个例子中,每个学生的成绩会根据分数从高到低计算出一个累计分布百分比。例如,如果有 10 名学生,当前学生是按成绩排序后的第 3 名,那么前三名(包括当前学生)的学生数占总学生数的比例即为当前学生的累计分布百分比。如果前三名的成绩相同,那么这三名学生的累计分布百分比相同,都是 0.3。


6. PERCENT_RANK()

    功能PERCENT_RANK() 函数计算每个记录在结果集中的相对排名百分比。这个函数会返回一个介于 0 和 1 之间的值,其中 0 表示排名最高(第一位),而 1 表示排名最低(最后一位)。计算方式是 (rank - 1) / (total rows - 1)

   对比

     PERCENT_RANK() 提供了一个介于0和1之间的数值,这个数值表示当前行的相对排名。
    它用于确定行在其分组内的相对位置,而不是一个绝对的排名数字。

    举例:

SELECT name, score, PERCENT_RANK() OVER (ORDER BY score DESC) as percent_rank
FROM students;

   说明:在这个例子中,每个学生的成绩会根据分数从高到低计算出一个百分比排名。第一名的学生百分比排名是 0,最后一名的百分比排名是 1,其他学生的百分比排名介于两者之间。

这篇关于Hive 排名函数ROW_NUMBER、RANK()、DENSE_RANK等功能介绍、对比和举例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/660532

相关文章

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

zookeeper端口说明及介绍

《zookeeper端口说明及介绍》:本文主要介绍zookeeper端口说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、zookeeper有三个端口(可以修改)aVNMqvZ二、3个端口的作用三、部署时注意总China编程结一、zookeeper有三个端口(可以

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客