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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值