微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在MySQL中执行分组排名

如何解决如何在MySQL中执行分组排名

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

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。