如何查询每门功课成绩前两名

diyiziran 2012-03-16 03:08:57
表AA如下:
学号 课程号 成绩
1 1 90
2 2 89
3 2 80
4 1 81
5 1 85
6 2 100


请指点,谢谢
...全文
1573 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
fensese 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
SQL code
select 学号,课程号
from
(select 学号,课程号,row_number()over(partition by 课程号,成绩 order by 学号) rn from AA)
where rn<3
[/Quote]

我也是这么认为的
小厨笔记 2012-03-28
  • 打赏
  • 举报
回复
这个很详细![Quote=引用 8 楼 的回复:]

测试数据:
SQL code

CREATE TABLE T161
(
SNO NUMBER(2),
CNO NUMBER(2),
Score NUMBER(3)
);
INSERT INTO T161 VALUES(1, 1, 90);
INSERT INTO T161 VALUES(2, 2, 89);
INSERT INTO T161 VALUES(3, 2, ……
[/Quote]
diyiziran 2012-03-28
  • 打赏
  • 举报
回复
标准sql的实现:
select * from aa a where a.stuid in (
select top 2 stuid from aa where a.couid=couid order by score desc
)
order by couid,score desc


在sql server 2000运行得到预期结果
ssqtjffcu 2012-03-28
  • 打赏
  • 举报
回复

with tt as(
select 1 "学号",1 "课程号",90 "成绩" from dual
union all
select 2,2,89 from dual
union all
select 3,2,80 from dual
union all
select 4,1,81 from dual
union all
select 5,1,85 from dual
union all
select 6,2,100 from dual
)select * from (select "学号","课程号",rank() over (partition by "课程号" order by "成绩" desc) rn from tt) where rn<=2
zhangqin12356 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

--如果不考虑分数重复,用RANK()
select m.学号 , m.课程号 , m.成绩 from
(
select t.* , RANK() over(partition by 课程号 order by 成绩 desc) px from aa t
) m
where px <= 2
order by m.课程号 , m.成绩 desc

--如果考虑分数重复,用DENS……
[/Quote]

学习了
C911honey 2012-03-19
  • 打赏
  • 举报
回复
网页超多的这种,找度娘
yingzhilian2008 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dawugui 的回复:]
--如果不考虑分数重复,用RANK()
select m.学号 , m.课程号 , m.成绩 from
(
select t.* , RANK() over(partition by 课程号 order by 成绩 desc) px from aa t
) m
where px <= 2
order by m.课程号 , m.成绩 desc

--如果考虑分数重复,用DENSE……
[/Quote]这个绝对的
我心飞翔 2012-03-17
  • 打赏
  • 举报
回复
测试数据:

CREATE TABLE T161
(
SNO NUMBER(2),
CNO NUMBER(2),
Score NUMBER(3)
);
INSERT INTO T161 VALUES(1, 1, 90);
INSERT INTO T161 VALUES(2, 2, 89);
INSERT INTO T161 VALUES(3, 2, 80);
INSERT INTO T161 VALUES(4, 1, 81);
INSERT INTO T161 VALUES(5, 1, 85);
INSERT INTO T161 VALUES(6, 2, 100);

INSERT INTO T161 VALUES(7, 1, 90); --分数相同


测试结果:
tangren 2012-03-17
  • 打赏
  • 举报
回复
--写一个不用分析函数的
SELECT * FROM AA a)
WHERE 2 > (SELECT COUNT(1)
FROM AA b
WHERE b.课程号 = a.课程号
AND a.成绩 < b.成绩);
huan_lxyd 2012-03-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dawugui 的回复:]

--如果不考虑分数重复,用RANK()
select m.学号 , m.课程号 , m.成绩 from
(
select t.* , RANK() over(partition by 课程号 order by 成绩 desc) px from aa t
) m
where px <= 2
order by m.课程号 , m.成绩 desc

--如果考虑分数重复,用DENS……
[/Quote]

正解。。
wangpengpengwang 2012-03-17
  • 打赏
  • 举报
回复 1
只知道和相关子查询有关,以你的智商自己查资料看看应该能自己解决。
lxyzxq2008 2012-03-16
  • 打赏
  • 举报
回复
分析函数就行啊
select * from (
select 学号,课程号,成绩,rank()over(partition by 课程号 order by 成绩 desc) rn
from table
)
where rn < 3
  • 打赏
  • 举报
回复

select 学号,课程号,成绩
from
(select 学号,课程号,成绩,
row_number()over(partition by 课程号 order by 成绩 desc) rn
from AA)
where rn<3
dawugui 2012-03-16
  • 打赏
  • 举报
回复
--如果不考虑分数重复,用RANK()
select m.学号 , m.课程号 , m.成绩 from
(
select t.* , RANK() over(partition by 课程号 order by 成绩 desc) px from aa t
) m
where px <= 2
order by m.课程号 , m.成绩 desc

--如果考虑分数重复,用DENSE_RANK()
select m.学号 , m.课程号 , m.成绩 from
(
select t.* , DENSE_RANK() over(partition by 课程号 order by 成绩 desc) px from aa t
) m
where px <= 2
order by m.课程号 , m.成绩 desc
dawugui 2012-03-16
  • 打赏
  • 举报
回复
select t.* from aa t where 成绩 in (select 成绩 from tb where 课程号 = t.课程号 and rownum <= 2 order by 成绩 desc)
cosio 2012-03-16
  • 打赏
  • 举报
回复
select 学号,课程号
from
(select 学号,课程号,row_number()over(partition by 课程号,成绩 order by 学号) rn from AA)
where rn<3

17,090

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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