按最高年级排序学生,然后为每个学生排序

Order students by highest grade and then order grades for each student

学生 年级 课程
约翰 10 代数
约翰 7 计算机科学
安娜 10 代数
安娜 10 数据结构
雅各布 10 数据结构
乔治 6 计算机科学
乔治 10 代数
乔治 9 数据结构

我有上面的 table 我想做的是按学生的最高课程成绩排序(与 10 或 10 和 9 的学生相比,10 和 10 的学生排在第一位甚至有 10 & 9 & 9 的人),然后为每个学生按年级排序课程。结果应该类似于下面的 table:

学生 年级 课程
安娜 10 数据结构
安娜 10 计算机科学
乔治 10 代数
乔治 9 数据结构
乔治 6 代数
约翰 10 代数
约翰 7 计算机科学
雅各布 10 数据结构

有没有办法实现这个结果?

您可以在 ORDER BY 子句中使用 window 函数。所以:

order by max(grade) over (partition by student) desc,
         student,
         grade desc

使用此查询:

SELECT Student, GROUP_CONCAT(LPAD(Grade, 2, '0') ORDER BY Grade DESC) grades
FROM tablename
GROUP BY Student

你得到每个学生的所有成绩,在逗号分隔列表中用 0 填充:

Student grades
ANNA 10,10
GEORGE 10,09,06
JACOB 10
JOHN 10,07

您可以将上述查询加入 table 并按该成绩列表降序排序:

SELECT t.*
FROM tablename t 
INNER JOIN (
  SELECT Student, GROUP_CONCAT(LPAD(Grade, 2, '0') ORDER BY Grade DESC) grades
  FROM tablename
  GROUP BY Student
) g ON g.Student = t.Student
ORDER BY grades DESC, Grade DESC

参见demo
结果:

Student Grade Course
ANNA 10 Algebra
ANNA 10 Data structures
GEORGE 10 Algebra
GEORGE 9 Data structures
GEORGE 6 Computer science
JOHN 10 Algebra
JOHN 7 Computer science
JACOB 10 Data structures