日期:2014-05-18  浏览次数:20481 次

许多人提出过,到现在还没有真正解决的问题
有一组数据如下

学生编号     学生课程     学生成绩
001                 语文                 90
001                 语文                 80
001                 语文                 90


002                 语文                 70
002                 语文                 90
002                 语文                 70

003                 语文                 92
003                 语文                 90
003                 语文                 90

我想用分组   得到每个学生的语文最高成绩
select   *   from   成绩表     where   学生成绩=(select   top   1   max(学生成绩)   from   成绩表     group   by   学生编号   )   order   by   学生成绩   desc

这样写并不能解决问题

------解决方案--------------------
如果只有这些列, 直接 max 就行了

select
学生编号 ,学生课程 ,学生成绩= max(学生成绩)
from 表
group by 学生编号 ,学生课程

------解决方案--------------------
select 学生编号,学生课程,学生成绩= max(学生成绩) from 表 where 学生课程= '语文 ' group by 学生编号,学生课程
------解决方案--------------------
-- 如果还有其他数据

select * from 成绩表 a
where 学生成绩=(select max(学生成绩) from 成绩表 where 学生编号 = a.学生编号 and 学生课程 = a.学生课程)


-- 或
select * from 成绩表 a
where not exists(
select * from 成绩表 where 学生编号 = a.学生编号 and 学生课程 = a.学生课程 and 学生成绩 > a.学生成绩)
------解决方案--------------------
Create Table 成绩表
(ID Int Identity(1, 1),
学生编号 Char(3),
学生课程 Nvarchar(10),
学生成绩 Int)
Insert 成绩表 Select '001 ', N '语文 ', 90
Union All Select '001 ', N '语文 ', 80
Union All Select '001 ', N '语文 ', 90
Union All Select '002 ', N '语文 ', 70
Union All Select '002 ', N '语文 ', 90
Union All Select '002 ', N '语文 ', 70
Union All Select '003 ', N '语文 ', 92
Union All Select '003 ', N '语文 ', 90
Union All Select '003 ', N '语文 ', 90
GO
select 学生编号, 学生课程, 学生成绩 from 成绩表 A where ID = (select top 1 ID from 成绩表 Where 学生编号 = A.学生编号 And 学生课程 = A.学生课程 Order By 学生成绩 desc, ID)
GO
Drop Table 成绩表
--Result
/*
学生编号 学生课程 学生成绩
001 语文 90
002 语文 90
003 语文 92
*/