IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 基于hive的SQL排名函数详解 -> 正文阅读

[大数据]基于hive的SQL排名函数详解

前言

在hive的学习中接触到了三种很实用的排名函数,这些函数在Mysql8.0版本中也已存在,
分别是:Rank(),Dense_rank(),Row_number(),
虽然都是排名函数,但三者间的些许差异很容易让人搞混,在这篇文章中,我将基于hive结合一个学生成绩排名的例子来对这三种排名函数进行解释与辨析。

一、学生成绩表准备

进行学生表的创建以及样例数据的导入

create table stu(sno varchar(5),score int) row format delimited fields terminated by ',';

load data local inpath '/opt/module/data/stu_score.txt' into table stu;

查看学生表:
学生表
从数据中可以看出,s01,s03,s06号学生的成绩相同,本文要介绍的这三种排名函数的主要差异就是在对相同成绩的排名时采用不同的处理办法,以至于得到不同的结果。

接下来就是根据具体例子对三种函数进行讲解。

二、Rank()函数

Rank()函数可以根据指定的字段来排序,排序时如果遇到排名字段值相同的情况时,会将相同的归为一组,也就是值相同,排名就是相同的,后面的排名会顺延,总排名数是不会改变的。

举一个例子:Rank()函数排序可以理解为:每个人先根据成绩高低从左到右坐好座位,座位上先根据人数标好连续的序号,成绩相同的人座位的序号都改为成绩相同的第一个人的座位序号,后面的人座位的的序号还是原来排好的,不会改变。

使用Rank()函数根据score字段对stu表进行降序排序的sql语句:

select sno,score,rank() over (order by score desc) from stu;

如下图所示,s01,s03,s06号学生成绩都是90分,使用Rank()排名时,他们三个人都是第二名,最后一名s05因为排名顺延,最终排名是第六,即总排名数是不会改变的,总共有六个人,总排名数就是六。

rank函数排序结果

三、Dense_rank()函数

Dense_rank()函数可以根据指定的字段来排序,排序时如果遇到排名字段值相同的情况时,会将相同的归为一组,后面的接着前面的排序序号。

Dense_rank()函数与Rank()函数的不同点在于:即使存在相同字段值的话,排名也不是跳跃的,Dense_rank()函数进行的排名是连续的。也就是相比于Rank()函数,Dense_rank()函数的总排名数会减少。

举一个例子:Dense_rank()函数排序可以理解为:每个人先根据成绩高低从左到右坐好座位,座位上根据人数标好连续的序号,成绩相同的人座位的序号都改为成绩相同的第一个人的座位序号,后面的人座位的的序号接着前面的人的序号而改变,不保持原来的序号。

使用Dense_rank()函数根据score字段对stu表进行降序排序的sql语句:

select sno,score,dense_rank() over (order by score desc) from stu;

如下图所示,s01,s03,s06号学生成绩都是90分,使用Dense_rank()排名时,他们三个人都是第二名,s04成为第三名,最后一名s05排名最终排名是第四,即总排名数因为有成绩相同的学生而减少。

dense_rank函数排名结果

四、Row_number()函数

Row_number()函数可以根据指定的字段来排序,Row_number()函数比较直接,排好名后,排名序号就是从上到下连续的,比较容易理解。

再举一个例子:Row_number()函数排序可以理解为:每个人先根据成绩高低从左到右坐好座位,座位上根据人数标好连续的序号,就可以了。

使用Row_number()函数根据score字段对stu表进行降序排序的sql语句:

select sno,score,row_number() over (order by score desc) from stu;

如下图所示,s01,s03,s06号学生成绩都是90分,使用Row_number()排名时,他们三个人分别是第二第三第四名,没有出现相同排名的情况,最后总排名数与人数相同。

row_number函数排名结果

五、总结

不论是在学习工作中还是面试中,hive中排名函数的使用都是一个十分重要的点,应该牢牢掌握。
后续会总结出排名函数有关的题目与解答,供大家参考。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-29 23:27:58  更:2021-07-29 23:28:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 21:57:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码