一尘不染

如何在MySQL中执行分组排名

mysql

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

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变量进行排名,例如此处,但是如何对分组集进行排名呢?感谢您的见解!


阅读 351

收藏
2020-05-17

共1个答案

一尘不染

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步的测试中使用该值。
2020-05-17