-1

我使用 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 我在写下时需要排名号

4

5 回答 5

1

尝试这个

SELECT    *,
      @curRank := @curRank + 1 AS rank
FROM      t1, (SELECT @curRank := 0) r
ORDER BY  grade desc limit 0,3 ;
于 2013-11-03T15:02:55.090 回答
1
select std_name, grade from T1 where grade in
    (select top 3 grade from T1 order by grade desc)
order by grade desc
于 2013-11-03T15:03:32.667 回答
0

您需要首先获得不同的最高分,获得其中的前 3 名,然后从那里开始:

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)等等。

于 2013-11-03T15:05:43.077 回答
0

获取具有相等或更高值的不同等级的计数为三个或更少的行。

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
于 2013-11-03T15:06:49.473 回答
0

我不知道 OLAPRnK函数是什么。但是 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;

好的,这不会将连字符放在排名之后(这很容易使用字符操作完成),但我不明白为什么这是可取的。

于 2013-11-03T16:23:30.893 回答