我使用SQL Server 2008
我有下表T1
Std_Name | Grade
-------------
ALI | 60
San | 55
Saqo | 55
SARA | 50
JOER | 50
MANDA | 50
AEROP | 25
NOAM | 24
如何让学生获得最高 3 最高分?
结果应该是:
RNK# - Std_Name | Grade
-----------------
1- ALI | 60
2- San | 55
2- Saqo | 55
3- SARA | 50
3- JOER | 50
3- MANDA | 50
不使用像RnK FUNCTION
这样的OLAP函数DBRM是SQL SERVER 我写下来时需要等级编号
答案 0 :(得分:1)
试试这个
SELECT *,
@curRank := @curRank + 1 AS rank
FROM t1, (SELECT @curRank := 0) r
ORDER BY grade desc limit 0,3 ;
答案 1 :(得分:1)
select std_name, grade from T1 where grade in
(select top 3 grade from T1 order by grade desc)
order by grade desc
答案 2 :(得分:0)
您需要先获得不同最高分,然后选择那些的前三名,然后从那里开始:
select Std_Name, Grade
from t1
where grade in (
select top 3 distinct grade
from t1
order by grade desc
)
您没有告诉我们您的RDBMS,因此top 3
(SQLServer)可能会变成limit 3
(mysql)等。
答案 3 :(得分:0)
获取等于或高于等于或等于3的不同等级的计数的行。
Select * from T1 a
where (select count(distinct grade)
from t1
where grade >= a.Grade) <= 3
在输出结果中排名
Select (select count(distinct grade)
from t1
where grade >= a.Grade) rank,
Std_Name, Grade
from T1 a
where (select count(distinct grade)
from t1
where grade >= a.Grade) <= 3
答案 4 :(得分:0)
我不知道OLAP RnK
函数是什么。但SQL Server支持ANSI标准窗口函数dense_rank()
,它完全符合您的要求。这将用作:
select [RNK#], Std_Name, Grade
from (select t1.*,
dense_rank() over (order by grade desc) as [RNK#]
from t1
) t1
where [RNK#] <= 3;
好的,这不会在排名后放置连字符(使用字符操作很容易完成),但我不明白为什么这是可取的。