【问题标题】:Ms access ranking top three女士访问排名前三
【发布时间】:2016-05-26 11:36:55
【问题描述】:

在过去的几个小时里,我一直被困在如何找到前三名学生并对其进行排名并说明他们的位置。因此,有一个表格,其中包含学生姓名和他们的分数。我想使用查询来查找得分最高的前三名学生并分配他们的位置,即第一、第二和第三。我该怎么做?

edit:我还需要找到特定班级中的佼佼者,例如五年级。此信息也位于不同字段的同一张表中。

【问题讨论】:

    标签: sql ms-access ranking


    【解决方案1】:

    您可以使用相关子查询来分配排名:

    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,1,2 这样的排名怎么办
    【解决方案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 给出的方法是一种更好的方法。

    【讨论】:

      猜你喜欢
      • 2013-10-05
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多