选择前3个组

时间:2013-11-03 15:00:28

标签: sql sql-server select

我使用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 我写下来时需要等级编号

5 个答案:

答案 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;

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