首页 > 代码库 > hive 中row_number(),rank,dense_ran()的用法

hive 中row_number(),rank,dense_ran()的用法

hive中一般取top n时,row_number(),rank,dense_ran()这三个函数就派上用场了,

先简单说下这三函数都是排名的,不过呢还有点细微的区别。

通过代码运行结果一看就明白了。

示例数据:

1	a	102	a	123	b	134	b	125	a	146	a	157	a	138	b	119	a	1610	b	1711	a	14

sql语句

select id,name,sal,rank()over(partition by name order by sal desc ) rp,dense_rank() over(partition by name order by sal desc ) drp,row_number()over(partition by name order by sal desc) rmpfrom f_test

结果

10    b    17    1    1    13    b    13    2    2    24    b    12    3    3    38    b    11    4    4    49    a    16    1    1    16    a    15    2    2    211    a    14    3    3    35    a    14    3    3    47    a    13    5    4    52    a    12    6    5    61    a    10    7    6    7

从结果看出

rank() 排序相同时会重复,总数不会变  

dense_rank()排序相同时会重复,总数会减少

row_number() 会根据顺序计算

正好听到一个需求,求sal前50%的人

用这个写了一下,

select * from (select id,name,sal,rank()over(partition by name order by sal desc ) rp,dense_rank() over(partition by name order by sal desc ) drp,row_number()over(partition by name order by sal desc) rmp, count(*)over(partition by name) *0.5 as countfrom f_test) t where t.rp <t.count; 

感觉虽然可以实现,但是有点复杂,有没有更好的方法实现呢

 

hive 中row_number(),rank,dense_ran()的用法