row_number

第一种函数:row_number从1开始,按照顺序,生成分组内记录的序列,row_number()的值不会存在重复,当排序的值相同时,按照表中记录的顺序进行排列

效果如下:
98      1
97      2
97      3
96      4
95      5
95      6没有并列名次情况,顺序递增

RANK

第二种函数:RANK() 生成数据项在分组中的排名,排名相等会在名次中留下空位

效果如下:
98      1
97      2
97      2
96      4
95      5
95      5
94      7有并列名次情况,顺序跳跃递增

dense_rank

第三种函数:DENSE_RANK() 生成数据项在分组中的排名,排名相等会在名次中不会留下空位

效果如下:
98      1
97      2
97      2
96      3
95      4
95      4
94      5
有并列名次情况,顺序递增

案例综合演示

准备数据

userid   classno score
1 gp1808 80
2 gp1808 92
3 gp1808 84
4 gp1808 86
5 gp1808 88
6 gp1808 70
7 gp1808 98
8 gp1808 84
9 gp1808 86
10 gp1807 90
11 gp1807 92
12 gp1807 84
13 gp1807 86
14 gp1807 88
15 gp1807 80
16 gp1807 92
17 gp1807 84
18 gp1807 86
19 gp1805 80
20 gp1805 92
21 gp1805 94
22 gp1805 86
23 gp1805 88
24 gp1805 80
25 gp1805 92
26 gp1805 94
27 gp1805 86
create table if not exists stu_score
(userid  int,classno string,score   int
)row format delimitedfields terminated by ' ';load data local inpath '/data/stu_score.txt' overwrite into table stu_score;
select * from stu_score;

需求1:对每次考试按照考试成绩倒序

select *,
row_number() over(partition by classno order by score desc) rn1
from stu_score;select *,
rank() over(partition by classno order by score desc) rn2
from stu_score;select *,
dense_rank() over(distribute by classno sort by score desc) rn3
from stu_score;select *,
dense_rank() over(order by score desc) `全年级排名`
from stu_score;

需求2:获取每次考试的排名情况

select *,
-- 没有并列,相同名次依顺序排
row_number() over(distribute by classno sort by score desc) rn1,
-- rank():有并列,相同名次空位
rank() over(distribute by classno sort by score desc) rn2,
-- dense_rank():有并列,相同名次不空位
dense_rank() over(distribute by classno sort by score desc) rn3
from stu_score;
+------+-------+-----+---+---+---+
|userid|classno|score|rn1|rn2|rn3|
+------+-------+-----+---+---+---+
|26    |gp1805 |94   |1  |1  |1  |
|21    |gp1805 |94   |2  |1  |1  |
|25    |gp1805 |92   |3  |3  |2  |
|20    |gp1805 |92   |4  |3  |2  |
|23    |gp1805 |88   |5  |5  |3  |
|27    |gp1805 |86   |6  |6  |4  |
|22    |gp1805 |86   |7  |6  |4  |
|24    |gp1805 |80   |8  |8  |5  |
|19    |gp1805 |80   |9  |8  |5  |
|11    |gp1807 |92   |1  |1  |1  |
|16    |gp1807 |92   |2  |1  |1  |
|10    |gp1807 |90   |3  |3  |2  |
|14    |gp1807 |88   |4  |4  |3  |
|13    |gp1807 |86   |5  |5  |4  |
|18    |gp1807 |86   |6  |5  |4  |
|12    |gp1807 |84   |7  |7  |5  |
|17    |gp1807 |84   |8  |7  |5  |
|15    |gp1807 |80   |9  |9  |6  |
|7     |gp1808 |98   |1  |1  |1  |
|2     |gp1808 |92   |2  |2  |2  |
|5     |gp1808 |88   |3  |3  |3  |
|9     |gp1808 |86   |4  |4  |4  |
|4     |gp1808 |86   |5  |4  |4  |
|8     |gp1808 |84   |6  |6  |5  |
|3     |gp1808 |84   |7  |6  |5  |
|1     |gp1808 |80   |8  |8  |6  |
|6     |gp1808 |70   |9  |9  |7  |
+------+-------+-----+---+---+---+

需求3:求每个班级的前三名

select *
from
(
select *,
row_number() over(partition by classno order by score desc) rn1
from stu_score
) A
where rn1 <4;

换种写法

with a as (select *,row_number() over (distribute by classno sort by score desc) `rn`from stu_score)
select *
from a
where a.rn < 4;
+------+-------+-----+--+
|userid|classno|score|rn|
+------+-------+-----+--+
|26    |gp1805 |94   |1 |
|21    |gp1805 |94   |2 |
|25    |gp1805 |92   |3 |
|11    |gp1807 |92   |1 |
|16    |gp1807 |92   |2 |
|10    |gp1807 |90   |3 |
|7     |gp1808 |98   |1 |
|2     |gp1808 |92   |2 |
|5     |gp1808 |88   |3 |
+------+-------+-----+--+

总结

  • 三种排序方式的区别要明确

Hive排名函数入门相关推荐

  1. Hive自定义函数入门实例

    概念 UDF函数一共分为三种类型: ​ UDF-一进一出,给定一个参数,输出一个处理后的数据 ​UDAF-多进一出,属于聚合函数,类似于count.sum等函数 ​UDTF-一进多出,属于一个参数,返 ...

  2. Hive date_format函数入门

    date_format 的语法: date_format(date/timestamp/string ts, string fmt) 举几个例子 select date_format('2015-04 ...

  3. Hive from_unixtime函数入门

    目的 转换时间戳为指定格式的时间 案例 两个参数,一个是时间戳,单位是秒! 不是ms,另一个是需要输出的格式 select from_unixtime(1567896035000,'HH'); 04 ...

  4. hive时间函数入门

    1)当前系统时间函数:current_date().current_timestamp().unix_timestamp() -- 函数1:current_date(); 当前系统日期 格式:&quo ...

  5. hive explode函数入门及其与lateral view的结合

    简单用法 举个例子 select collect_list(name) from t_order; 结果 +---------------------------------------------- ...

  6. 基于hive的SQL排名函数详解

    前言 在hive的学习中接触到了三种很实用的排名函数,这些函数在Mysql8.0版本中也已存在, 分别是:Rank(),Dense_rank(),Row_number(), 虽然都是排名函数,但三者间 ...

  7. Hive分析函数之ntile、排名函数学习

    1.Ntile使用 可以看成是:它把有序的数据集合平均分配到指定的数量(num)个桶中, 将桶号分配给每一行.如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最多相差1. 语法是:nt ...

  8. Hive开窗函数——排名函数开窗

    排名函数开窗 rank() over 作用:查出指定条件后的进行排名,条件相同排名相同,排名间断不连续. 说明:例如学生排名,使用这个函数,成绩相同的两名是并列,下一位同学空出所占的名次.即:1 1 ...

  9. hive窗口函数之排名函数row_number、rank和dense_rank

    文章目录 简单排名 分组排名 练习1-取前两名学生 练习2-连续签到次数 排名函数主要有row_number.rank和dense_rank. 简单排名 row_number是行号,不会重复,rank ...

最新文章

  1. Pytorch完成基础的模型-线性回归
  2. 统计计量 | 诺奖得主Angrist的因果推断课程文献读物单子
  3. mysql如果存在则删除数据库_怎么判断sql数据库是否存在,存在删除
  4. 网络传输 中文乱码问题
  5. SQL获取刚插入的记录的自动增长列ID的值
  6. boost::hana::is_subset用法的测试程序
  7. C语言程序设计 | 结构体,枚举,联合
  8. C#4.0 Collections【集合】
  9. 预告|CVPR 2021 论文分享会日程公布!与计算机视觉领域学者一起收获“立体”参会体验...
  10. linux mysql 不区分大小写,Linux下设置MySQL不区分大小写_MySQL
  11. Windows域环境下的网络问题
  12. java-HDU1698(线段树的区间更新,和区间查询)
  13. GPUImageMovie播放控制
  14. 聚类算法分析及其性能比较
  15. delphi xe3 mysql,delphi10.3安装使用mySQL
  16. TestNG官方文档中文版(1)-介绍
  17. windows10服务器iis发布网站,win10系统+iis7发布网站或服务的详细办法
  18. Hacker News API
  19. 苹果笔记本计算机内存不足怎么办,苹果手机更新系统内存不够怎么处理-电脑内存不足怎么解决...
  20. 【观察】致敬开发者,华为云最新地铁广告释放了哪些信号?

热门文章

  1. Windows10---开启FTP服务与配置
  2. koa2 导出excel表格设置样式_一调整Excel表格的行列宽度,图片又得重新调整?点这个设置就行...
  3. 《图像分析基础》的专有名词解析
  4. android中自适应布局教程,Android实现自适应正方形GridView
  5. vue框架+cesium项目怎么才能运行成功
  6. 计算机网络拓扑结构方案总结,计算机网络拓扑结构总结
  7. java web接收tcp_Java多线程实现TCP网络Socket编程(C/S通信)
  8. python中 n是换几行_如何在Python中用`\ n`替换通用换行符?
  9. collins词典第八版mdx_英语词典选择
  10. 控制层远程调用业务层_如何应用数据访问服务层分离系统中的业务层和持久层之间耦合关系...