日期:2014-05-17  浏览次数:20442 次

聚合求最大值然后筛选?
有个学生表,有id(学号),name(名字),date(日期),score(分数)
里面存了很多学生不同日期的分数,每名学生多个日期的记录,每天一个分数,
现在想求每个学生分数最高的那条记录,所有字段都要查出来,我用group by 能求出每名学生的最大分数,但是把date也要选出来,我就无力了, 说group by必须包含date,但是select包含了date结果又不对。

------解决方案--------------------
你这问题简单说就是每个学生最大分数对应的所有记录信息
1:用row_number() 函数,按学生分组,分数倒序  ,取序号为1 的
2:将分数格式化成固定长度的字符串如入char(4)+日期固定长度字符串char(10)
   然后求这个最大字符串,截取右边10位 就是 日期
------解决方案--------------------
select *
from tb a
where exists (select 1 from (select id,max(score)score from tb group by id) b
where a.id=b.id and a.score=b.score)
------解决方案--------------------
select *
from 
(
select *,rn=ROW_NUMBER() over(partition by 学号 order by 分数 desc) from 成绩表
)t
where rn=1

------解决方案--------------------
如果是sql server 2005以后的版本:

select id,name,date,score
from 
(
select *,
       ROW_NUMBER() over(partition by id 
                             order by score desc) 
from 学生表
)t
where rn=1