hive窗口函数rank()/dense_rank()/row_number()的区别

hive中一般取top n时,都会用到row_number(),rank,dense_ran()这三个函数,row_number()、rank()、dense_rank()三个函数相当于group by之后再来个order by。

例1

有三列数据,商品id、商品名称product、销售金额amount,数据如下

id product amount
1   a   10
2   a   12
3   b   13
4   b   12
5   a   14
6   a   15
7   a   13
8   b   11
9   a   16
10  b   17
11  a   14

使用窗口函数

select 
    id,
    product,
    amount,
    rank()over(partition by product order by amount desc ) as rk,
    dense_rank() over(partition by product order by amount desc ) as drk,
    row_number()over(partition by product order by amount desc) as rn
from temp;

输出结果

 
ID  NAME  SAL  rk   drk   rn
10   b    17    1     1         1
3    b    13    2     2         2
4    b    12    3     3         3
8    b    11    4     4         4
9    a    16    1     1         1
6    a    15    2     2         2
11   a    14    3     3         3
5    a    14    3     3         4
7    a    13    5     4         5
2    a    12    6     5         6
1    a    10    7     6         7

结论

rank():对amount排序时,如果amount有重复值,rank值也会重复,但总数不会变  

dense_rank():对amount排序时,如果amount有重复值时,rank值也会重复,但总数会变少

row_number():对amount排序时,如果amount有重复值时,rank值不会重复,但总数不变

例2

对例1的数据取销售金额amount前50%的商品

select 
    t.id,

    t.product,

    t.amount,

    t.rk,

    t.drk,

    t.rn
from (
    select 
        id,
        product,
        amount,
        rank() over(partition by product order by amount desc ) rk,
        dense_rank() over(partition by product order by amount desc ) drk,
        row_number() over(partition by product order by amount desc) rn,
        count(*) over(partition by product)*0.5 as count
    from temp
) t where t.rk < t.count; 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值