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

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

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

NameClassGrade
Zhang SanA80
Li SiB83
Wang WuA88
Zhao LiuC92
Chen QiB79
Wu BaC85

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

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语句。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页