请教高难度的SQL查询。

jixiang8 2007-05-22 05:27:07
请选出每个班级的前三名的学号和总分数,
记录如下:
学号 班级 英语 语文 总分
1 1-1 98 88 521
2 1-1 95 86 500
3 1-2 94 77 512
4 1-4 75 71 491
5 1-2 81 81 490
6 1-1 91 91 580
123 1-2 86 77 498
234 1-1 76 78 412
145 1-3 69 71 408
162 1-3 69 81 428
141 1-5 80 80 488

结果如:
班级   学号   总分  名次
1-1 6 580 1
1-1 1 521 2
1-1 2 500 3
1-2 3 512 1
1-2 5 490 2
1-2 234 485 3
1-3 123 498 1
1-3 162 428 1


表结构如下:
create table TBL_SCORE
(
FID NUMBER not null,
FCLASSID VARCHAR2(16),
CHINESE_SCORE NUMBER,
ENGLISH_SCORE NUMBER,
SUM_SCORE NUMBER
);
insert into TBL_SCORE (FID, FCLASSID, CHINESE_SCORE, ENGLISH_SCORE, SUM_SCORE)
values (1, '1-1', 98, 88, 521);
insert into TBL_SCORE (FID, FCLASSID, CHINESE_SCORE, ENGLISH_SCORE, SUM_SCORE)
values (2, '1-1', 95, 86, 500);
insert into TBL_SCORE (FID, FCLASSID, CHINESE_SCORE, ENGLISH_SCORE, SUM_SCORE)
values (3, '1-2', 94, 77, 512);
insert into TBL_SCORE (FID, FCLASSID, CHINESE_SCORE, ENGLISH_SCORE, SUM_SCORE)
values (4, '1-4', 75, 71, 491);
insert into TBL_SCORE (FID, FCLASSID, CHINESE_SCORE, ENGLISH_SCORE, SUM_SCORE)
values (5, '1-2', 81, 81, 490);
insert into TBL_SCORE (FID, FCLASSID, CHINESE_SCORE, ENGLISH_SCORE, SUM_SCORE)
values (6, '1-1', 91, 91, 580);
insert into TBL_SCORE (FID, FCLASSID, CHINESE_SCORE, ENGLISH_SCORE, SUM_SCORE)
values (123, '1-2', 86, 77, 498);
insert into TBL_SCORE (FID, FCLASSID, CHINESE_SCORE, ENGLISH_SCORE, SUM_SCORE)
values (234, '1-1', 76, 78, 412);
insert into TBL_SCORE (FID, FCLASSID, CHINESE_SCORE, ENGLISH_SCORE, SUM_SCORE)
values (145, '1-3', 69, 71, 408);
insert into TBL_SCORE (FID, FCLASSID, CHINESE_SCORE, ENGLISH_SCORE, SUM_SCORE)
values (162, '1-3', 69, 81, 428);
insert into TBL_SCORE (FID, FCLASSID, CHINESE_SCORE, ENGLISH_SCORE, SUM_SCORE)
values (141, '1-5', 80, 80, 488);
...全文
134 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
facome 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

SELECT *
FROM (SELECT t.Fclassid, t.Sum_Score, Row_Number() Over(PARTITION BY t.Fclassid ORDER BY t.Sum_Score DESC) Rn
FROM Tbl_Score t)
WHERE Rn <4
[/Quote]
jixiang8 2007-05-22
  • 打赏
  • 举报
回复
SELECT *
FROM (SELECT t.Fclassid, t.Sum_Score, Row_Number() Over(PARTITION BY t.Fclassid ORDER BY t.Sum_Score DESC) Rn
FROM Tbl_Score t)
WHERE Rn <4
HelloWorld_001 2007-05-22
  • 打赏
  • 举报
回复
不好意思,太匆忙了
select 中的字段缺少了 SUM_SCORE,楼主自己加上就可以了
HelloWorld_001 2007-05-22
  • 打赏
  • 举报
回复
select FCLASSID,FID,ENGLISH_SCORE,rn from (select FID,FCLASSID,ENGLISH_SCORE,row_number() over (partition by FCLASSID order by SUM_SCORE desc ) as rn from TBL_SCORE ) t
where rn<=3

已测试

楼主好人啊,写测试数据!-_-

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧