许多人提出过,到现在还没有真正解决的问题
有一组数据如下
学生编号 学生课程 学生成绩
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
*/