最近几个小时我一直被困在如何找到并排名前三名的学生并说明他们的位置。因此,有一个表格,其中包含学生姓名及其分数。我想使用一个查询来找到具有最高分的前三名学生并分配他们的位置,即第一,第二和第三。我怎么能这样做?
编辑:我还需要找到特定班级的优秀学生,例如5年级。此信息也位于不同字段的同一个表中。
答案 0 :(得分:3)
您可以使用相关子查询分配排名:
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;
答案 1 :(得分:2)
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给出的方法是更好的方法。