Sql 选择前3组

Sql 选择前3组,sql,sql-server,select,Sql,Sql Server,Select,我使用SQLServer2008 我有下表T1 我怎样才能得到前三名成绩最好的学生 结果应该是: RNK# - Std_Name | Grade ----------------- 1- ALI | 60 2- San | 55 2- Saqo | 55 3- SARA | 50 3- JOER | 50 3- MANDA | 50 不使用像RnK函数这样的OLAP函数 DBRM是SQL SERVER 我写下时需要排名编号试试这个 SELE

我使用SQLServer2008

我有下表T1

我怎样才能得到前三名成绩最好的学生

结果应该是:

RNK# - Std_Name | Grade
-----------------
1-    ALI   | 60
2-    San   | 55
2-    Saqo  | 55
3-    SARA  | 50
3-    JOER  | 50
3-    MANDA | 50  
不使用像RnK函数这样的OLAP函数

DBRM是SQL SERVER 我写下时需要排名编号

试试这个

SELECT    *,
      @curRank := @curRank + 1 AS rank
FROM      t1, (SELECT @curRank := 0) r
ORDER BY  grade desc limit 0,3 ;
您需要首先获得不同的最高分数,然后从中选出前3名:

select Std_Name, Grade
from t1
where grade in (
    select top 3 distinct grade
    from t1
    order by grade desc
)

您还没有告诉我们您的RDBMS,因此前3名SQLServer可能会变成limit 3 mysql等。

获取相同或更高值的不同级别的计数为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

我不知道OLAP RnK函数是什么。但是SQL Server支持ANSI标准窗口函数,它可以完全满足您的需要。这将被用作:

select [RNK#], Std_Name, Grade
from (select t1.*,
             dense_rank() over (order by grade desc) as [RNK#]
      from t1
     ) t1
where [RNK#] <= 3;

好的,这不会把连字符放在排名之后,这很容易通过字符操作完成,但是我不明白为什么这样做是可取的。

为什么你会考虑OLAP?为什么你不想使用秩函数?我需要一个秩编号在标准名称之前我需要一个秩编号在标准名称之前_name@jonasvermeulen-Jack不是OP。这可能适用于OP,也可能不适用于OP,因为它似乎使用非标准MySQL功能。我需要排名std_名称前的数字如果不正确,请尝试使用数据:60 55,然后选择top 3:它将仅返回60。。所要求的是不同的3@MargoStefin啊!我在评论中加入了distinct,但在查询中没有提到它!它现在在里面。至于排名,在你用你正在使用的数据库标记你的问题之前,我不会编写任何代码。对于一个回答来说,语法太多了。我使用的是SQL SERVER 2008。请不要使用稠密的秩或秩或任何OLAP函数。请@玛格丽特芬。你能解释一下为什么你不想使用专门设计的ANSI标准函数来满足你的要求吗?简单的sql函数,比如count、group、average等等
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
select [RNK#], Std_Name, Grade
from (select t1.*,
             dense_rank() over (order by grade desc) as [RNK#]
      from t1
     ) t1
where [RNK#] <= 3;