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

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

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

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

示例数据:

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

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) rmp
from f_test

结果

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() 排序相同时会重复,总数不会变

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 count
from f_test
) t where t.rp <t.count;

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

时间: 2025-01-02 13:54:20

hive 中row_number(),rank,dense_ran()的用法的相关文章

SQL2005中row_number()等函数的用法

SQL2005中row_number()等函数的用法 今天刚装了SQL Server 2005,感觉还行,2005比2000新增了几个函数,分别是row_number().rank().dense_rank().ntile(),下面以实例分别简单讲解一下. create table gg(sname varchar(10),sort varchar(10),num int) go insert into gg select '白芍','根茎类',55 union all select '法半夏'

sqlserver 中row_number,rank,dense_rank,ntile排名函数的用法

1.row_number() 就是行号 2.rank:类似于row_number,不同之处在于,它会对order by 的字段进行处理,如果这个字段值相同,那么,行号保持不变 3.dense_rank:与rank类似,不同之处在于行号是否保留一个位置,rank对保留这个位置,即上面图中,row的值由1直接变为3,因为它的1出现了两次,所以为2保留了一个位置,而dense_rank不会保留2这个位置,即实现的行号2其实是排在了第3位 4.ntile函数可以对序号进行分组处理.这就相当于将查询出来的

Hive中unix_timestamp和from_unixtime的用法

unix_timestamp的用法: unix_timestamp(String str) 如果参数str格式满足yyyy-MM-DD HH:mm:ss格式,例如:str值为2020-02-02 02:02:02,用法为 select unix_timestamp(2020-02-02 02:02:02); 如果参数str格式不满足yyyy-MM-DD HH:mm:ss格式,例如:str值为2020-02-02,用法为 select unix_timestamp(‘2020-02-02’,'yy

Hive分析窗口函数(二) NTILE,ROW_NUMBER,RANK,DENSE_RANK

问题导读: 1.NTILE作用是什么? 2.按照pv降序排列,生成分组内每天的pv名次可使用哪个窗口函数? 3.RANK 和 DENSE_RANK作用是什么? 接上篇:Hive分析窗口函数(一)SUM,AVG,MIN,MAX 本文中介绍前几个序列函数,NTILE,ROW_NUMBER,RANK,DENSE_RANK,下面会一一解释各自的用途. Hive版本为 apache-hive-0.13.1 注意: 序列函数不支持WINDOW子句.(什么是WINDOW子句,Hive分析窗口函数(一)SUM,

ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法

Oracle 中的 ROW_NUMBER() OVER() 分析函数的用法 ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内是连续且唯一的). 举例: SQL> DESC T1; Name                                           Null?    Type----------------------

sql中的exist in在hive中的用法

Hive不支持where子句中的子查询,SQL常用的exist in子句需要改写. 这一改写相对简单.考虑以下SQL查询语句: SELECT a.key, a.value FROM a WHERE a.key in (SELECT b.key FROM B); 改写成: SELECT a.key, a.value FROM a LEFT OUTER JOIN b ON (a.key = b.key) WHERE b.key <> NULL; 解释:先做左连接,结果形如: aaa  111 bb

hive中order by,sort by, distribute by, cluster by作用以及用法

1. order by Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,所以说,只有hive的sql中制定了order by所有的数据都会到同一个reducer进行处理(不管有多少map,也不管文件有多少的block只会启动一个reducer).但是对于大量数据这将会消耗很长的时间去执行. 这里跟传统的sql还有一点区别:如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit来

hive中order by,sort by, distribute by, cluster by的用法

1.order by hive中的order by 和传统sql中的order by 一样,对数据做全局排序,加上排序,会新启动一个job进行排序,会把所有数据放到同一个reduce中进行处理,不管数据多少,不管文件多少,都启用一个reduce进行处理.如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit来限制输出条数,原因是:所有的数据都会在同一个reducer端进行,数据量大的情况下可能不能出结果,那么在这样的严格模式下,必须指定输

Hive中分组取前N个值

分享两篇文章,结合看更清楚一点. 背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的学生成绩,针对学生成绩表,根据学科,成绩做order by排序,然后对排序后的成绩,执行自定义函数row_number(),必须带一个或者多个列参数,如ROW_NUMBER(col1, ....),它的作用是按指定的列进行分组生成行序列.在ROW_NUMBER(a,b) 时,若两条记录的a,b列相同