hive--分组排序函数

分组排序
最主要的区别就是如果两个分数相同,排名是否同列以及排名是否相同。

这个方法仅在mysql8.0以后,hive或其他数据库支持

直接看图:原始表
原始表

原表如上,想要的结果如下

在这里插入图片描述

从图中可以发现:

  1. row_number函数:如果并列但名次反而不相同,但是后续的名次是连续的
  2. rank函数:如果并列则名次相同,但是后续的名次会不连续
  3. dense_rank函数:如果并列则名次相同,但是后续的名次是连续的
  4. ntile函数:如果并列则名次相同,后续的名次连续
    最主要区别

row_number
基本原理是先使用over子句中的排序语句对记录进行排序,然后再根据这个排序生成序号。

select *, row_number() over (order by score desc) as rank
from score;

查询结果如下
在这里插入图片描述

一般在工作中,常用分组排序做web程序的分页,然后我们指定查询范围。
row_number()进阶

rank
作用效果和row_number()方法类似,但是支持并列排名,但排名名次可能不连续。

select *, rank() over (order by score desc) as rank
from score;

查询结果如下
在这里插入图片描述

dense_rank
作用效果和rank()方法类似,不仅支持并列排名,而且排名也是连续的

select *, dense_rank() over (order by score) as rank
from score;

查询结果如下
在这里插入图片描述

ntile
ntile()函数是最好理解,同时也是最不好理解的。结果既能够和其他函数相似,也能够有很大的区别。

select *, ntile(3) over (order by score desc) as rank
from score;

查询结果如下
在这里插入图片描述

ntile函数可以对序号进行分组处理,类似于hive的分桶处理:

ntile函数的分桶依据:

1、每组的记录数不能大于它上一组的记录数,即编号小的桶放的记录数不能小于编号大的桶。也就是说,第1组中的记录数只能大于等于第2组及以后各组中的记录数。
2、所有组中的记录数要么都相同,要么从某一个记录较少的组(命名为X)开始后面所有组的记录数都与该组(X组)的记录数相同。也就是说,如果有个组,前三组的记录数都是9,而第四组的记录数是8,那么第五组和第六组的记录数也必须是8。

举个栗子
如果是50条,那么就是
1-10 : 第一组 (十条)
11-20 : 第二组(十条)
21-30 : 第三组(十条)
31-40 : 第四组(十条)
41-50 : 第五组(十条)

如果是51条,那么就是
1-11 : 第一组(十一条)
12-21 : 第二组(十条)
22-31 : 第三组(十条)
32-41 : 第四组(十条)
42-51 : 第五组(十条)

总结
在使用分组排序函数的时候要注意以下三点:

  1. 排名函数必须要有over子句
  2. 排名函数必须要有order by的over子句
  3. 分组内从1开始排序
Hive SQL中的分组排序可以使用窗口函数和ORDER BY子句来实现。在给定的表中,可以使用PARTITION BY子句将数据按照指定的列进行分组,然后使用ORDER BY子句对每个分组内的数据进行排序。 例如,引用\[1\]中的示例代码展示了如何在students_article表中按照student_id进行分组,并使用rand()函数进行随机抽样,然后使用ROW_NUMBER()函数为每个学生的作文进行编号。最后,通过WHERE子句筛选出每个学生的前5篇作文。 另外,引用\[2\]中的示例代码展示了如何在service_visit表中按照visit_hour进行分组,并使用visit_cnt进行排序。通过使用ROW_NUMBER()函数为每个小时内的服务进行编号,然后通过WHERE子句筛选出每个小时内访问量前2的服务。 综上所述,Hive SQL中的分组排序可以通过窗口函数和ORDER BY子句来实现,具体的实现方式可以根据具体的需求和数据结构进行调整。 #### 引用[.reference_title] - *1* [hive sql 分组随机取数](https://blog.csdn.net/weixin_35057064/article/details/127227430)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [[Hive SQL] 实现分组排序分组topN](https://blog.csdn.net/sinat_41663922/article/details/118379494)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值