sql分组求和取最大值

问题:表t有三个字段,student(学生姓名),class(科目),score(成绩),需要找到总成绩最高的学生的姓名 (可能有多个)

一开始的做法:
select student,sum(score) from t group by student having sum(score) =
(select temp.s from
(select student,sum(score) s from t group by student order by s desc limit 1) as temp)

思路是先分组求和,然后对和最大的值取出来,当分组求和的列表的一个值等于最大的值,则取出这条记录。但是group by了两次,想当不爽。

后面找到了rank函数,于是有了这个写法
select * from (
with tmp as(
select student,sum(score) as sum_score from student group by student )
select rank() OVER ( order by tmp.sum_score desc) as cc,* from tmp) as tc  where tc.cc = 1

把分组求和做成一个临时视图tmp,然后找出临时视图rank over排序后的排序为1的记录。
rank over函数在pg,mssql,oracle中都可用,在mysql中不能用

猜你喜欢

转载自lvxing607.iteye.com/blog/2022776