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

相关文章

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

20.Spring5注解介绍

1.配置组件 Configure Components 注解名称说明@Configuration把一个类作为一个loC容 器 ,它的某个方法头上如果注册7@Bean , 就会作为这个Spring容器中的Bean@ComponentScan在配置类上添加@ComponentScan注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>@Sc

十五.各设计模式总结与对比

1.各设计模式总结与对比 1.1.课程目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring做铺垫。 3、 了解各设计模式之间的关联,解决设计模式混淆的问题。 1.2.内容定位 1、 掌握设计模式的"道" ,而不只是"术" 2、 道可道非常道,滴水石穿非一日之功,做好长期修炼的准备。 3、 不要为了

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

java中查看函数运行时间和cpu运行时间

android开发调查性能问题中有一个现象,函数的运行时间远低于cpu执行时间,因为函数运行期间线程可能包含等待操作。native层可以查看实际的cpu执行时间和函数执行时间。在java中如何实现? 借助AI得到了答案 import java.lang.management.ManagementFactory;import java.lang.management.Threa

android 免费短信验证功能

没有太复杂的使用的话,功能实现比较简单粗暴。 在www.mob.com网站中可以申请使用免费短信验证功能。 步骤: 1.注册登录。 2.选择“短信验证码SDK” 3.下载对应的sdk包,我这是选studio的。 4.从头像那进入后台并创建短信验证应用,获取到key跟secret 5.根据技术文档操作(initSDK方法写在setContentView上面) 6.关键:在有用到的Mo

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

Android我的二维码扫描功能发展史(完整)

最近在研究下二维码扫描功能,跟据从网上查阅的资料到自己勉强已实现扫描功能来一一介绍我的二维码扫描功能实现的发展历程: 首页通过网络搜索发现做android二维码扫描功能看去都是基于google的ZXing项目开发。 2、搜索怎么使用ZXing实现自己的二维码扫描:从网上下载ZXing-2.2.zip以及core-2.2-source.jar文件,分别解压两个文件。然后把.jar解压出来的整个c

人工和AI大语言模型成本对比 ai语音模型

这里既有AI,又有生活大道理,无数渺小的思考填满了一生。 上一专题搭建了一套GMM-HMM系统,来识别连续0123456789的英文语音。 但若不是仅针对数字,而是所有普通词汇,可能达到十几万个词,解码过程将非常复杂,识别结果组合太多,识别结果不会理想。因此只有声学模型是完全不够的,需要引入语言模型来约束识别结果。让“今天天气很好”的概率高于“今天天汽很好”的概率,得到声学模型概率高,又符合表达

SQL Server中,isnull()函数以及null的用法

SQL Serve中的isnull()函数:          isnull(value1,value2)         1、value1与value2的数据类型必须一致。         2、如果value1的值不为null,结果返回value1。         3、如果value1为null,结果返回vaule2的值。vaule2是你设定的值。        如