Hive中,row_number() over(partition by) 和group by的区别

row_number() over (partition by) 和 group by 的区别

现在假设Score表中有如下数据:

Name Class Grade
Zhang San A 80
Li Si B 83
Wang Wu A 88
Zhao Liu C 92
Chen Qi B 79
Wu Ba C 85

现在需要求得各个班级最高分,那么我们可以这样写:

select class, max(grade) from score group by class;

当然也可以这样写:

select class, grade from 
	(select *, row_number() over 
		(partition by class order by grade desc) grade_desc
	) from score score_sorted)
where grade_desc=1;

看起来后面这种写法要复杂很多,的确,如果只需要不太多的信息,第一种方法是最佳的。

但是,如果需要更多信息,比如每个班第一名的名字,那么第二种方法就很有效了。

select name, class, grade from 
	(select *, row_number() over 
		(partition by class order by grade desc) grade_desc
	) from score score_sorted)
where grade_desc=1;

因此,二者的区别在于,如果要select出不在group by语句中的项目,则应该使用row_number() over(partition by),如果需要select的项目全在group by中,则使用group by语句。

你可能感兴趣的:(Hadoop学习笔记)