sql - 没有 Rank() 的排名

标签 sql sql-server rank

这是表格:

StuId   Name    Class   Marks
-----------------------------
2003    aman    X-A     91
2005    ankita  X-A     89
2010    Aakash  X-A     87
2011    Cyril   X-A     87
2012    Bala    X-B     87
2013    Sara    X-C     89
2014    Katlyn  X-C     89
2015    Casy    X-C     87
2016    Katie   X-B     93

我需要输出表为:

StuId   Name    Class   Marks Rank
-----------------------------------
2003    aman    X-A     91    1
2005    ankita  X-A     89    2
2010    Aakash  X-A     87    3
2011    Cyril   X-A     87    3
2016    Katie   X-B     93    1
2012    Bala    X-B     87    2
2013    Sara    X-C     89    1
2014    Katlyn  X-C     89    1
2015    Casy    X-C     87    3

为此我执行了以下查询:

SELECT *,
    RANK() OVER (PARTITION BY Class ORDER BY Marks DESC) AS Rank
FROM StudentTable;

但是如何在不使用 Rank() 的情况下获得相同的结果? ?

最佳答案

您可以尝试使用相关子查询,该子查询对同一“类”中更高或相等的标记使用不同的计数。

SELECT *, 
(
 SELECT COUNT(DISTINCT s2.Marks) 
 FROM StudentTable s2 
 WHERE s2.Class = s.Class 
   AND s2.Marks >= s.Marks
) AS Rank
FROM StudentTable s
ORDER BY Class, Marks DESC;

可以找到测试db<>fiddle here

但是RANK会更有效率。

关于sql - 没有 Rank() 的排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58517030/

相关文章:

python - 两个表之间的onetoone数据库关系?

sql - 对所有内容进行后端(数据库端)验证是否可行?

sql-server - TSQL 返回结果是否比 SQL Server 中的存储过程更快

c# - 有效读取单个数据行

php - 以有效的方式计算行排名

选择排名查询后的 MySql Where 条件

sql - 如何使用 ST_DWithin 查找近点?

mysql - 为什么 MySQL AI id 会这样?

sql-server - 使用 SQL Server 字符串函数提取值

mysql - mysql 中的 Rank() 优于 Partition by