DENSE_RANK() 可以完美解决。
DENSE_RANK() :
此函数返回结果集分区中每行的排名,排名值没有间断。 特定行的排名等于该特定行之前不同排名值的数量加一。
如果两个或更多行在同一分区中具有相同的排名值,那么每个行将获得相同的排名。 例如,如果两位顶尖销售员具有相同的 SalesYTD 值,则他们的排名值都为一。 接下来 SalesYTD 最高的销售人员排名值为二。 这比所讨论的行之前的不同行的数量多了一。 因此,DENSE_RANK 函数返回的数字没有间断,并且始终具有连续的排名值。
https://docs.microsoft.com/zh-cn/sql/t-sql/functions/dense-rank-transact-sql?view=sql-server-ver15以下是完整测试代码:
--drop table #SCORE
CREATE TABLE #SCORE
(NAME varchar(32) not null
,GRADE INT not null
)
insert #SCORE(NAME,GRADE) values('学生 1',cast(rand()*100 as int))
insert #SCORE(NAME,GRADE) values('学生 2',cast(rand()*100 as int))
insert #SCORE(NAME,GRADE) values('学生 3',95)
insert #SCORE(NAME,GRADE) values('学生 4',cast(rand()*100 as int))
insert #SCORE(NAME,GRADE) values('学生 5',cast(rand()*100 as int))
insert #SCORE(NAME,GRADE) values('学生 6',95)
insert #SCORE(NAME,GRADE) values('学生 7',cast(rand()*100 as int))
insert #SCORE(NAME,GRADE) values('学生 8',cast(rand()*100 as int))
insert #SCORE(NAME,GRADE) values('学生 9',cast(rand()*100 as int))
insert #SCORE(NAME,GRADE) values('学生 10',80)
insert #SCORE(NAME,GRADE) values('学生 12',cast(rand()*100 as int))
insert #SCORE(NAME,GRADE) values('学生 13',cast(rand()*100 as int))
insert #SCORE(NAME,GRADE) values('学生 14',cast(rand()*100 as int))
insert #SCORE(NAME,GRADE) values('学生 15',80)
insert #SCORE(NAME,GRADE) values('学生 16',cast(rand()*100 as int))
insert #SCORE(NAME,GRADE) values('学生 17',cast(rand()*100 as int))
select * from (
select
t.NAME,t.GRADE,DENSE_RANK() over(order by grade desc ) RANK
from #SCORE t
) t
where t.RANK<=10