【发布时间】:2016-05-26 11:36:55
【问题描述】:
在过去的几个小时里,我一直被困在如何找到前三名学生并对其进行排名并说明他们的位置。因此,有一个表格,其中包含学生姓名和他们的分数。我想使用查询来查找得分最高的前三名学生并分配他们的位置,即第一、第二和第三。我该怎么做?
edit:我还需要找到特定班级中的佼佼者,例如五年级。此信息也位于不同字段的同一张表中。
【问题讨论】:
在过去的几个小时里,我一直被困在如何找到前三名学生并对其进行排名并说明他们的位置。因此,有一个表格,其中包含学生姓名和他们的分数。我想使用查询来查找得分最高的前三名学生并分配他们的位置,即第一、第二和第三。我该怎么做?
edit:我还需要找到特定班级中的佼佼者,例如五年级。此信息也位于不同字段的同一张表中。
【问题讨论】:
您可以使用相关子查询来分配排名:
select top 3 m.*,
(select 1 + count(*)
from marks m2
where m2.mark > m.mark
) as ranking
from marks m
order by mark desc;
请注意,此排名等同于 ANSI SQL 中的 rank() 函数。所以,如果第一名有三个并列,排名是1、1、1、4。
进行密集排名将使用count(distinct),这是 MS Access 不支持的。也许这行得通:
select top 3 m.*,
(select 1 + count(*)
from (select distinct mark
from marks m2
where m2.mark > m.mark
) as m
) as ranking
from marks m
order by mark desc;
【讨论】:
SELECT TOP 3 name, mark,
CASE WHEN mark = (SELECT TOP 1 mark FROM marks ORDER BY mark DESC, name)
THEN "First"
WHEN mark = (SELECT MIN(t.mark) FROM (SELECT TOP 2 mark FROM marks ORDER BY mark DESC, name) t)
THEN "Second"
ELSE "Third"
END AS Position
FROM marks
ORDER BY mark DESC, name
请注意,如果您想获得排名前 10 的学生(而不是 3 个),则此解决方案无法很好地扩展。在这种情况下,@Gordon 给出的方法是一种更好的方法。
【讨论】: