mysql - 如何在 MySQL 中进行分组排名

标签 mysql sql window-functions

所以我有一张如下表:

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

现在我知道您可以使用临时变量来进行排名,like here ,但是我该如何为分组集呢?感谢您的任何见解!

最佳答案

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 中进行分组排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/532878/

相关文章:

sql - Postgresql根据另一个字段的变化改变值

Php Sql 获取值

php - 更新查询在 PHP 和 Mysql 中不起作用

SQL 服务器 : select same column 3 times into 1 column without UNION ALL

sql - 如何在订单中执行多个查询

sql - 窗口子句的解析函数和方法

sql - 为什么添加一个窗口函数会使这个查询变得如此缓慢?

mysql - 将现有 MySQL 数据库导入到 Azure 中的 MySQL 数据库

php - yii1 日期选择器在数据库中将值存储为 000-00-00

sql - 获取任何给定日期的库存产品列表