读书人

求教一个SQL,从学生表里找出最高成绩,

发布时间: 2011-12-31 23:50:30 作者: rapoo

求教一个SQL,从学生表里找出最高成绩,谢谢!
有如下表格:
学号 姓名 成绩 日期
940001 王平 60 2006/5/7
940001 王平 70 2006/6/10
940001 王平 80 2006/9/22
940001 王平 90 2006/10/15
940002 张三 61 2006/11/2
940002 张三 76 2006/12/10
940002 张三 82 2007/1/22
940002 张三 92 2007/3/1
940003 刘威 82 2007/1/20
940003 刘威 82 2007/3/12
940004 赵亮 77 2007/1/20
...


要在上面表格中找出每位同学的最高分和最低分,以及成绩增长的记录
其中:1,同一学生只有两条记录,并且成绩相同的,显示最近一条记录的时间
2,同一学生只有一条记录的,最高分和最的分显示相同的值
结果如下:
姓名 最高分 最低分 增长 取得最高分的日期
王平 90 60 30 2006/10/15
张三 92 61 31 2007/3/1
刘威 82 82 0 2007/3/12
赵亮 77 77 0 2007/1/20

求能够得出这样结果的SQL查询,谢谢各位高手了!!




[解决办法]
select b.*,
a.日期 [取得最高分的日期]
from (select 学号,姓名,日期 from tb t where not exists(select * from tb where 成绩> t.成绩 and 日期> t.日期
))a
left join

(select 学号,姓名,
max(成绩) [最高分],
min(成绩) [最低分],
max(成绩)-min(成绩) [增长]
from tb
group by
学号,姓名)b

on a.学号=b.学号 and a.姓名=b.姓名
[解决办法]
----wangdehao 正解吗??
create table tb(学号 varchar(10), 姓名 varchar(10), 成绩 int, 日期 datetime)
insert into tb select '940001 ', '王平 ', 60, '2006/5/7 '
union all select '940001 ', '王平 ', 70, '2006/6/10 '
union all select '940001 ', '王平 ', 80, '2006/9/22 '
union all select '940001 ', '王平 ', 90, '2006/10/15 '
union all select '940002 ', '张三 ', 61, '2006/11/2 '
union all select '940002 ', '张三 ', 76, '2006/12/10 '


union all select '940002 ', '张三 ', 82, '2007/1/22 '
union all select '940002 ', '张三 ', 92, '2007/3/1 '
union all select '940003 ', '刘威 ', 82, '2007/1/20 '
union all select '940003 ', '刘威 ', 82, '2007/3/12 '
union all select '940004 ', '赵亮 ', 77, '2007/1/20 '

select a.*,b.日期 '取得最高分的日期 ' from
(select 姓名,max(成绩)最高分,min(成绩)最低分,(max(成绩)-min(成绩))增长
from t a group by 学号,姓名
)a
left join
(select 姓名,成绩,max(日期)日期
from t a group by 学号,姓名,成绩
) b
on b.姓名=a.姓名 and b.成绩=a.最高分
order by a.增长 desc


/*
姓名最高分最低分增长取得最高分的日期
张三9261312007-03-01 00:00:00.000
王平9060302006-10-15 00:00:00.000
刘威828202007-03-12 00:00:00.000
赵亮777702007-01-20 00:00:00.000
*/

读书人网 >SQL Server

热点推荐