现在有两张表student和score,对每科的的成绩进行排名,取前三名学生的信息和排名
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了现在有两张表student和score,对每科的的成绩进行排名,取前三名学生的信息和排名相关的知识,希望对你有一定的参考价值。
student(姓名,学号,出生年月)score(学号,课程号,成绩)
SQL Server 2008 Express 版本下测试通过CREATE TABLE student (
[姓名] VARCHAR(10),
[学号] VARCHAR(10),
[出生年月] date
);
CREATE TABLE score (
[学号] VARCHAR(10),
[课程号] VARCHAR(10),
[成绩] int
);
INSERT INTO student
SELECT '凌大', '001', '2000-01-01' UNION ALL
SELECT '唐二', '002', '2000-02-02' UNION ALL
SELECT '张三', '003', '2000-03-03' UNION ALL
SELECT '李四', '004', '2000-04-04' UNION ALL
SELECT '王五', '005', '2000-05-05' UNION ALL
SELECT '赵六', '006', '2000-06-06';
INSERT INTO score
SELECT '001', 'ENGLISH', 91 UNION ALL
SELECT '002', 'ENGLISH', 92 UNION ALL
SELECT '003', 'ENGLISH', 93 UNION ALL
SELECT '004', 'ENGLISH', 94 UNION ALL
SELECT '005', 'ENGLISH', 95 UNION ALL
SELECT '006', 'ENGLISH', 96 UNION ALL
SELECT '001', 'MATH', 96 UNION ALL
SELECT '002', 'MATH', 95 UNION ALL
SELECT '003', 'MATH', 94 UNION ALL
SELECT '004', 'MATH', 93 UNION ALL
SELECT '005', 'MATH', 92 UNION ALL
SELECT '006', 'MATH', 91;
SELECT
*
FROM
(
SELECT
score.[课程号],
ROW_NUMBER() OVER (PARTITION BY score.[课程号] ORDER BY score.[成绩] DESC ) AS [排名],
student.*
FROM
student JOIN score
ON ( student.[学号] = score.[学号] )
) subQuery
WHERE
[排名] <= 3;
查询结果:
课程号 排名 姓名 学号 出生年月
---------- -------------------- ---------- ---------- ----------------
ENGLISH 1 赵六 006 2000-06-06
ENGLISH 2 王五 005 2000-05-05
ENGLISH 3 李四 004 2000-04-04
MATH 1 凌大 001 2000-01-01
MATH 2 唐二 002 2000-02-02
MATH 3 张三 003 2000-03-03
(6 行受影响)追问
这两张表已经存在了
追答我这是本地测试建表 和测试数据啊.
你那里有表的, 只需要执行最后的 查询语句就可以啦.
FROM ( SELECT 学号 ,
课程号 ,
成绩 ,
( SELECT COUNT(1) + 1
FROM score b
WHERE a.成绩 < b.成绩
AND a.课程号 = b.课程号
) 排名
FROM score A
) S
LEFT JOIN student T ON S.学号 = T.学号
WHERE 排名 <= 3
ORDER BY 课程号 , 排名 参考技术B select top 3 * from student as st inner join score as sc on st.学号=sc.学号 order by sc.成绩 desc 参考技术C 你这个只有写存储过程了啊 要用遍历
查询每个班级排名第三的学生
需求描述
有两张表,想要查询每个班级排名第三的学生。排名按照总成绩排(数学+英语)。表结构如图:
student表:
score表:
mysql version 5.5 or 8.0.
希望大家帮我写两个版本的。谢谢大家了
数据:
student表:
1 name1 class1
2 name2 class1
3 name3 class1
4 name4 class1
5 name5 class2
6 name6 class2
7 name7 class2
8 name8 class2
score表:
1 1 English 100
2 1 Math 95
3 2 English 96
4 2 Math 95
5 3 English 100
6 3 Math 99
7 4 English 98
8 4 Math 97
9 5 English 99
10 5 Math 95
11 6 English 96
12 6 Math 94
13 7 English 92
14 7 Math 100
15 8 English 97
16 8 Math 95
解决方法
-- #1 建表语句及初始化脚本
CREATE TABLE stu
(id SMALLINT,
name varchar(12),
className varchar(12)
)
CREATE TABLE score
(id SMALLINT,
stu_id varchar(12),
courseName varchar(12),
courseScore SMALLINT
)
INSERT INTO stu VALUES ('1','name1','class1');
INSERT INTO stu VALUES ('2','name2','class1');
INSERT INTO stu VALUES ('3','name3','class1');
INSERT INTO stu VALUES ('4','name4','class1');
INSERT INTO stu VALUES ('5','name5','class2');
INSERT INTO stu VALUES ('6','name6','class2');
INSERT INTO stu VALUES ('7','name7','class2');
INSERT INTO stu VALUES ('8','name8','class2');
INSERT INTO score VALUES ('1','1','English','100');
INSERT INTO score VALUES ('2','1','Math','95');
INSERT INTO score VALUES ('3','2','English','96');
INSERT INTO score VALUES ('4','2','Math','95');
INSERT INTO score VALUES ('5','3','English','100');
INSERT INTO score VALUES ('6','3','Math','99');
INSERT INTO score VALUES ('7','4','English','98');
INSERT INTO score VALUES ('8','4','Math','97');
INSERT INTO score VALUES ('9','5','English','99');
INSERT INTO score VALUES ('10','5','Math','95');
INSERT INTO score VALUES ('11','6','English','96');
INSERT INTO score VALUES ('12','6','Math','94');
INSERT INTO score VALUES ('13','7','English','92');
INSERT INTO score VALUES ('14','7','Math','100');
INSERT INTO score VALUES ('15','8','English','97');
INSERT INTO score VALUES ('16','8','Math','95');
-- #2 Mysql 8.0
SELECT * FROM
(
SELECT *,ROW_NUMBER()OVER(PARTITION BY className ORDER BY total DESC) rn
FROM
(
SELECT B.id,B.className,SUM(courseScore) total FROM score A
JOIN stu B
ON B.id = A.stu_id
WHERE A.courseName IN('Math','English')
GROUP BY B.id
ORDER BY B.className,total DESC
)A
)B
WHERE rn<=3
-- #3 Mysql 5.5
SELECT * FROM
(
select id,className,total,rank from (
select className,heyf_tmp.id,heyf_tmp.total,@rownum := @rownum+1 ,
if(@pdept= heyf_tmp.className,@rank:=@rank +1, @rank:= 1) as rank,
@pdept:=heyf_tmp.className
from (
SELECT B.id,B.className,SUM(courseScore) total FROM score A
JOIN stu B
ON B.id = A.stu_id
WHERE A.courseName IN('Math','English')
GROUP BY B.id
ORDER BY B.className,total DESC
) heyf_tmp ,
(select @rownum:=0 , @pdept:= null ,@rank:= 0) a
order by className asc ,total desc
) result
) A
WHERE A.rank<=3
order by className,rank;
-- #4 结果
/*
id className total rank
3 class1 199 1
1 class1 195 2
4 class1 195 3
5 class2 194 1
7 class2 192 2
8 class2 192 3
*/
执行结果
以上是关于现在有两张表student和score,对每科的的成绩进行排名,取前三名学生的信息和排名的主要内容,如果未能解决你的问题,请参考以下文章
设计一个表示学生的类:Student,该类的属性包括nameagescores(包含语文数学和英语三科成绩,每科成绩的类型为整数),此外该类还有3个方法。