当前位置: 首页 > 面试题库 >

如何在MySQL中执行分组排名

李新霁
2023-03-14
问题内容

所以我有一张桌子,如下所示:

ID_STUDENT | ID_CLASS | GRADE
-----------------------------
   1       |    1     |  90
   1       |    2     |  80
   2       |    1     |  99
   3       |    1     |  80
   4       |    1     |  70
   5       |    2     |  78
   6       |    2     |  90
   6       |    3     |  50
   7       |    3     |  90

然后,我需要对它们进行分组,排序和排序以给出:

ID_STUDENT | ID_CLASS | GRADE | RANK
------------------------------------
    2      |    1     |  99   |  1
    1      |    1     |  90   |  2
    3      |    1     |  80   |  3
    4      |    1     |  70   |  4
    6      |    2     |  90   |  1
    1      |    2     |  80   |  2
    5      |    2     |  78   |  3
    7      |    3     |  90   |  1
    6      |    3     |  50   |  2

现在,我知道您可以使用temp变量进行排名,例如此处,但是如何对分组集进行排名呢?感谢您的见解!


问题答案:
SELECT id_student, id_class, grade,
   @student:=CASE WHEN @class <> id_class THEN 0 ELSE @student+1 END AS rn,
   @class:=id_class AS clset
FROM
  (SELECT @student:= -1) s,
  (SELECT @class:= -1) c,
  (SELECT *
   FROM mytable
   ORDER BY id_class, id_student
  ) t

这以非常简单的方式起作用:

  1. 初始查询按id_class第一,id_student第二顺序排序。
  2. @student@class初始化为-1
  3. @class用于测试是否输入下一组。如果的先前值id_class(存储在中@class)不等于当前值(存储在中id_class),则将@student其清零。否则增加。
  4. @class分配了新值id_class,并将在下一行的第3步的测试中使用该值。


 类似资料:
  • 本文向大家介绍如何在MySQL中按分组字段排序?,包括了如何在MySQL中按分组字段排序?的使用技巧和注意事项,需要的朋友参考一下 要对分组字段进行ORDER BY,请将ORDER BY CASE与一起使用。CASE评估不同的条件,而ORDER BY则按升序或降序对值进行排序。MySQL用于查找匹配项。 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记

  • 问题内容: 我如何返回在MySQL中实际上是“连续的” GROUP BY。换句话说,GROUP BY是否尊重记录集的顺序? 例如,从下表中,col1是唯一的有序索引: 返回: 但我需要返回以下内容: 问题答案: 采用: 这里的关键是创建一个允许分组的人为值。 以前,更正了Guffa的答案:

  • 在声纳分析中,我们有很多符号执行的异常(在这里描述)。据我所知,负责符号执行的规则是S2259和S2583,所以我创建了一个质量配置文件,排除了这些规则,但在声纳分析中仍然有excetpions。我们使用sonar-maven-plugin进行分析,我用sonar6.5和sonar6.7进行了测试。我如何将符号执行排除在分析之外。

  • 问题内容: Oracle的表服务器提供了一个内置功能。此功能将任何时间戳转换为前一个星期日的午夜。在MySQL中执行此操作的最佳方法是什么? Oracle还提供将时间戳转换为发生该月的第一天的午夜。在MySQL中,这很简单: 但是这个技巧将在数周内失效。我知道此功能,但是我真的不想要一年内的星期数。这些东西是用于多年的工作。 问题答案: 想通了…有点麻烦,但这就是。 而且,如果您的业务规则说您的工

  • 问题内容: 如何返回在MySQL中实际上是“连续的” GROUP BY的内容。换句话说,GROUP BY是否尊重记录集的顺序? 例如,从下表中,col1是唯一的有序索引: 返回: 但我需要返回以下内容: 问题答案: 使用: 这里的关键是创建一个允许分组的人为值。 以前,更正了Guffa的答案:

  • 问题内容: 我需要找到每个作者的最新帖子,然后对结果进行分组,所以我只为每个作者撰写一个最新帖子。 这样可以正确地对输出进行分组,因此每个作者只能得到一篇帖子,但是在对结果进行分组之后而不是在选择之前对结果进行排序。 问题答案: 编辑: 经过一番评论后,我决定添加一些其他信息。 我工作的公司也使用Postgres,尤其是SQL Server。该数据库不允许此类查询。因此,我知道还有另一种方法(我在