MySQL:在 window 函数中使用 MAX 未返回最大值
MySQL: Using MAX in a window function not returning highest values
我正在寻找每个 student_id 的最高成绩。
年级分数保存在这个 table:
注册人数table:
student_id
course_id
等级
2
2
95
2
3
95
1
1
90
1
2
99
3
1
80
3
2
75
3
3
82
正确的结果应该是:
student_id
course_id
等级
1
2
99
2
2
95
3
3
82
这是我正在尝试的查询:
SELECT student_id, course_id, grade
FROM Enrollments
GROUP BY student_id
HAVING grade = (SELECT MAX(grade) OVER(PARTITION BY student_id))
ORDER BY student_id ASC
但是对于这个查询,我得到的结果是:
student_id
course_id
等级
1
2
90
2
2
95
3
3
80
即学生1的成绩是90,应该是99,学生2的成绩是80,应该是82.
问题似乎是此查询仅从 table 中的第一个 course_id 中选择最高成绩,但我不确定为什么会这样。
请试试这个查询。
SELECT e.student_id, e.course_id, e.grade
FROM Enrollments e INNER JOIN
(SELECT student_id as student_id, MAX(grade) as grade FROM Enrollments GROUP BY student_id) sbq
ON e.student_id = sbq.student_id
WHERE e.grade = sbq.grade;
您可以使用 row_number,以获得您想要的结果
CREATE TABLE Table1
(`student_id` int, `course_id` int, `grade` int)
;
INSERT INTO Table1
(`student_id`, `course_id`, `grade`)
VALUES
(2, 2, 95),
(2, 3, 95),
(1, 1, 90),
(1, 2, 99),
(3, 1, 80),
(3, 2, 75),
(3, 3, 82)
;
SELECT `student_id`, `course_id`, `grade`
FROM (SELECT `student_id`, `course_id`, `grade`
, ROW_NUMBER() OVER(PARTITION BY `student_id` ORDER BY `grade` DESC) rn
FROM Table1) t1
WHERE rn= 1
student_id | course_id | grade
---------: | --------: | ----:
1 | 2 | 99
2 | 2 | 95
3 | 3 | 82
db<>fiddle here
我正在寻找每个 student_id 的最高成绩。 年级分数保存在这个 table:
注册人数table:
student_id | course_id | 等级 |
---|---|---|
2 | 2 | 95 |
2 | 3 | 95 |
1 | 1 | 90 |
1 | 2 | 99 |
3 | 1 | 80 |
3 | 2 | 75 |
3 | 3 | 82 |
正确的结果应该是:
student_id | course_id | 等级 |
---|---|---|
1 | 2 | 99 |
2 | 2 | 95 |
3 | 3 | 82 |
这是我正在尝试的查询:
SELECT student_id, course_id, grade
FROM Enrollments
GROUP BY student_id
HAVING grade = (SELECT MAX(grade) OVER(PARTITION BY student_id))
ORDER BY student_id ASC
但是对于这个查询,我得到的结果是:
student_id | course_id | 等级 |
---|---|---|
1 | 2 | 90 |
2 | 2 | 95 |
3 | 3 | 80 |
即学生1的成绩是90,应该是99,学生2的成绩是80,应该是82.
问题似乎是此查询仅从 table 中的第一个 course_id 中选择最高成绩,但我不确定为什么会这样。
请试试这个查询。
SELECT e.student_id, e.course_id, e.grade
FROM Enrollments e INNER JOIN
(SELECT student_id as student_id, MAX(grade) as grade FROM Enrollments GROUP BY student_id) sbq
ON e.student_id = sbq.student_id
WHERE e.grade = sbq.grade;
您可以使用 row_number,以获得您想要的结果
CREATE TABLE Table1 (`student_id` int, `course_id` int, `grade` int) ;
INSERT INTO Table1 (`student_id`, `course_id`, `grade`) VALUES (2, 2, 95), (2, 3, 95), (1, 1, 90), (1, 2, 99), (3, 1, 80), (3, 2, 75), (3, 3, 82) ;
SELECT `student_id`, `course_id`, `grade` FROM (SELECT `student_id`, `course_id`, `grade` , ROW_NUMBER() OVER(PARTITION BY `student_id` ORDER BY `grade` DESC) rn FROM Table1) t1 WHERE rn= 1
student_id | course_id | grade ---------: | --------: | ----: 1 | 2 | 99 2 | 2 | 95 3 | 3 | 82
db<>fiddle here