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