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语句。
本文对比了SQL中row_number()over(partitionby)和groupby的功能差异。通过具体案例,阐述了当需要返回groupby字段外的其他信息时,row_number()over(partitionby)的优越性,如获取每个班级的第一名学生姓名及成绩。
4390

被折叠的 条评论
为什么被折叠?



