row number函数_Hive排名函数ROW_NUMBER,RANK 和 DENSE_RANK的区别

需求描述:分析最近三个月每天排名前30的邮箱收件数量。

涉及到的表字段:发件时间,收件人。

一、ROW_NUMBER

28f50eeac258fc24388c3a6e48a0aa1b.png

表t查询出了3月每天不同类型邮箱收件量的降序排名,表t1通过ROW_NUMBER函数给每行数据添加序列号,select ROW_NUMBER() over(partition by t.send_dt order by t.num desc) as row_num,在表t1的基础上查询row_num<=30且order by t1.send_dt,t1.num desc。结果如下:

06734e4e321be62580d136248eb98af7.png

明显不是想要的结果,ROW_NUMBER()从1开始,按照顺序,生成分组内记录的序列,如果分组内排名相同会顺序标记,那么问题来了,在嵌套查询1个月内每天TOP30的量时ORDER BY 中不能有序列字段就会出现以上乱序问题。

二、RANK

0c1de971a4117b333a85a36a82757d9b.png

通过RANK()函数统计的结果如下:

553b38d99fb2490cfaf13e1a6d06d8a0.png

结果可以看出,RANK() 生成数据项在分组中的排名,排名相等会在名次中留下空位

三、DENSE_RANK

d62c4c7ff9e04c1fa19698d47350ba8e.png

通过DENSE_RANK()函数查询结果如下:

f554f51ebc7baf8ec1421c062cf8b547.png

从结果可以看出,DENSE_RANK() 生成数据项在分组中的排名,排名相等会在名次中不会留下空位,以上需求中选择使用DENSE_RANK。

不妥之处希望得到指正,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值