hive中分区取TOPN

本文详细介绍了在Hive中如何使用row_number(), rank()和dense_rank()函数进行分组取TOPN操作。通过实例展示了在不同场景下,如分组-组内排序、分区-取前N、不分组排序等的应用,并提供了具体SQL查询语句。同时,对比了rank()和dense_rank()在处理相同值时的区别。
摘要由CSDN通过智能技术生成

目录

0. 概述

1. 准备数据和表结构

2. 几种不同分组取TOPN情况说明

2.1 分组-组内排序

2.2 分区-组内排序-取topN

2.3 不分组-只对某个字段排序

2.4 rank() over() 的使用

2.5 dense_rank()的使用

3. 参考资料


0. 概述

hive中分组取topN,有3中类型的函数可以用:

  • row_number() over (partition by col01 order by col02 desc )
  • rank() over (partition by col01 order by col02 desc )
  • dense_rank() over (partition by col01 order by col02 desc )

 


1. 准备数据和表结构

create table dws_db.employee (empid int ,deptid int ,salary decimal(10,2));

insert into dws_db.employee values(1,10,5500.00);

insert into dws_db.employee values(2,10,4500.00);

insert into dws_db.employee values(3,20,1900.00);

insert into dws_db.employee values(4,20,4800.00);

insert into dws_db.employee values(5,40,6500.00);

insert into dws_db.employee values(6,40,14500.00);

insert into dws_db.employee values(7,40,44500.00);

insert into dws_db.employee values(8,50,6500.00);

insert into dws_db.employee values(9,50,7500.00);

 

2. 几种不同分组取TOPN情况说明

2.1 分组-组内排序

对deptid分组,组内根据salary排序

select *, row_number() over(partition by deptid order by salary) as rank from employee

 

结果:

值相同,先出现的排名靠前

 

 

2.2 分区-组内排序-取topN

对deptid分组,组内根据salary降序排序,取每组内的前 1 名。

select * from (select *, row_number() over(partition by deptid order by salary desc) as salary_rank from employee) t where salary_rank <= 1

 

 

2.3 不分组-只对某个字段排序

所有数据进行排名,不用分组,只用 partition by 1即可

select *, row_number() over(partition by 1 order by salary desc) as salary_rank from employee

 

 

2.4 rank() over() 的使用

rank() over(partition by deptid order by salary desc )

 

select *, rank() over(partition by deptid order by salary desc) as salary_rank from employee

 

值相同是,排名会并列,下一个移动N,N为值相同的个数。

结果:

 

2.5 dense_rank()的使用

select *, dense_rank() over(partition by deptid order by salary desc) as salary_rank from employee

 

 


 

3. 参考资料

https://my.oschina.net/u/2000675/blog/1604035

https://blog.csdn.net/wiborgite/article/details/80521593

https://blog.csdn.net/longshenlmj/article/details/50525385

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值