hive中排名函数row_number() over()、rank() over()、dense_rank() over()

hive中排名函数row_number() over()、rank() over()、dense_rank() over()

1)row_number() over()函数

row_number() OVER (PARTITION BY COL1 ORDER BY COL2 [desc])
表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)
empid deptid salary


1 10 5500.00
2 10 4500.00
3 20 1900.00
4 20 4800.00
5 40 6500.00
6 40 14500.00
7 40 44500.00
8 50 6500.00
9 50 7500.00
需求:根据部门分组,显示每个员工的工资排名
预期结果:
empid deptid salary rank
----------- ----------- --------------------------------------- --------------------
1 10 5500.00 1
2 10 4500.00 2
4 20 4800.00 1
3 20 1900.00 2
7 40 44500.00 1
6 40 14500.00 2
5 40 6500.00 3
9 50 7500.00 1
8 50 6500.00 2
SQL脚本:
SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee;

2)rank() over()函数

rank() over(partition by col1 order by col2)
Rank()也是排名函数,ROW_NUMBER()是排序,当存在相同成绩的学生时,ROW_NUMBER()会依次进行排序,他们排名序号不相同,而Rank()则不一样出现相同的,他们的排名是一样的。如1,2,2,4。

3)dense_rank() over()函数

DENSE_RANK()密集的排名他和RANK()区别在于,排名的连续性,DENSE_RANK()排名是连续的,RANK()是跳跃的排名,所以一般情况下用的排名函数就是RANK()。如1,2,2,3。

4)Ntile()函数

定义:Ntile使用可以看成是:它把有序的数据集合平均分配到指定的数量(num)个桶中, 将桶号分配给每一行。如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最多相差1。
语法是:ntile (num) over ([partition_clause] order_by_clause) as your_bucket_num
然后可以根据桶号,选取前或后 n分之几的数据。
Select ntile(1) over(order by studentscore desc) as number,* from studentscore;
Select ntile(2) over(order by studentscore desc) as number,* from studentscore;
Select ntile(3) over(order by studentscore desc) as number,* from studentscore;
这里查询了3次,共有3个数据,第一次将所有数据分为1个“区” ,所以查询结果number全是1,第二次所有数据分为2个区,查询结果为 1 1 2,意思就是第一个‘区’ 为 1 1 两个编号的数据 ,第二个’区’只有2这个数据。第三次有3个区,再把区号给他们,就是1 2 3。


版权声明:本文为wenfei1997原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。