按最高年级排序学生,然后为每个学生排序
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
学生 | 年级 | 课程 |
---|---|---|
约翰 | 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 |