查询出各学年成绩增长最快的两名学生
下表为某校某些学生各个学年的成绩单,请编写SQL语句,查询出各学年成绩增长最快的两名学生.要求
a) 查询语句应当动态,可查询如多达50名学生,10多个学年数据的情况
b) 不使用游标
c) 在一个sql语句中完成
姓名 学年 成绩
A 2011 10
A 2012 50
A 2013 80
B 2011 40
B 2012 20
B 2013 70
C 2011 60
C 2012 70
C 2013 30
输出
学年 姓名 成绩差
2012 A 40
2012 C 10
2013 B 50
2013 A 30
1个回复
-
xsmile
生成数据表的代码如下:
DROP TABLE IF EXISTS `grade`;
CREATE TABLE `grade` (
`姓名` varchar(10) DEFAULT NULL,
`学年` int(11) DEFAULT NULL,
`成绩` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;LOCK TABLES `grade` WRITE;
INSERT INTO `grade` VALUES ('A',2011,10),('A',2012,50),('A',2013,80),('B',2011,40),('B',2012,20),('B',2013,70),('C',2011,60),('C',2012,70),('C',2013,30);
UNLOCK TABLES;生成需要的结果代码结果如下(没用开窗函数):
select 学年,姓名,变化 from
(
select aa.*,bb.变化 as 所有变化 from
(
SELECT a.*,a.成绩 -b.成绩 as 变化
FROM grade a left join grade b on a.姓名 = b.姓名 and a.学年 = b.学年 +1
having 变化>0 order by 学年, 变化 desc
) aa left join
(
SELECT a.*,a.成绩 -b.成绩 as 变化
FROM grade a left join grade b on a.姓名 = b.姓名 and a.学年 = b.学年 +1
having 变化>0 order by 学年, 变化 desc
) bb on aa.学年=bb.学年
) aaa group by 学年,姓名 having sum(变化<所有变化)<=21年前 我来评论