select * from (
select tbname.*,rank() over(partition by 班级 order by 成绩 desc) rk
from tbname ) t
where rk<3; 10:17:56 SQL> select * from sc;S# C# GRADE
---------- ---------- ----------
001 A 80
001 B 90
001 C 78
002 C 76
003 A 80
003 B 90
004 A 80
004 B 89
004 C 90已选择9行。已用时间: 00: 00: 00.47
10:20:25 SQL> select * from (
10:20:30 2 select sc.*,rank() over(partition by s# order by grade desc) rk from sc) t
10:20:38 3 where rk<3;S# C# GRADE RK
---------- ---------- ---------- ----------
001 B 90 1
001 A 80 2
002 C 76 1
003 B 90 1
003 A 80 2
004 C 90 1
004 B 89 2已选择7行。已用时间: 00: 00: 00.31
10:20:40 SQL>
select tbname.*,rank() over(partition by 班级 order by 成绩 desc) rk
from tbname ) t
where rk<3; 10:17:56 SQL> select * from sc;S# C# GRADE
---------- ---------- ----------
001 A 80
001 B 90
001 C 78
002 C 76
003 A 80
003 B 90
004 A 80
004 B 89
004 C 90已选择9行。已用时间: 00: 00: 00.47
10:20:25 SQL> select * from (
10:20:30 2 select sc.*,rank() over(partition by s# order by grade desc) rk from sc) t
10:20:38 3 where rk<3;S# C# GRADE RK
---------- ---------- ---------- ----------
001 B 90 1
001 A 80 2
002 C 76 1
003 B 90 1
003 A 80 2
004 C 90 1
004 B 89 2已选择7行。已用时间: 00: 00: 00.31
10:20:40 SQL>
谢谢你的答案。不过我有些不明白:
"rank() over(partition by 班级 order by 成绩 desc) rk from tbname"
其中rank() over和partition by 我以前都没见过,可不可以解释一下,万分感谢
加上 按照"班级"分组,并根据 "成绩"降序排序后的序号
用下面这个函数保险哦:
dense_rank() over(partition by...)
以下是我找的关于rank()的使用方法,供大家参考:
rank() over (partition by col1 order by col2)
表示根据col1分组,在分组内部根据 col2排序
排序的时候跟派名次一样,可以并列2个第一名之后 是第3名结帖!