我有一张学生桌和一张等级表。
“成绩”看起来像这样:
student_id|course_id|grade
===========================
1 | 1 | A
1 | 2 | B
1 | 3 | A
3 | 1 | F
3 | 3 | C
.
.
.
.
这不是整个表格,但你得到了要点。我正在尝试编写一个查询,其中选择学生的姓名和该学生的最高成绩。由于我是SQL的新手,这对我来说有点困惑。到目前为止我的尝试是:
SELECT "Students".name, "Grades".grade FROM "Students" INNER JOIN
"Grades" ON "Students".student_id = "Grades".student_id GROUP BY name,
grade HAVING MIN(grade) <= 'F';
这是错的,我知道为什么,但我不知道从哪里开始。
答案 0 :(得分:0)
SELECT Students.name, min(Enroll.grade)
FROM Students
INNER JOIN Enroll
ON Students.student_id = Enroll.student_id
GROUP BY name,
答案 1 :(得分:0)
如何在某列中选择值最高的?
大胆强调我的。
GROUP BY
可以获得单个列的最大值。要获得最大值的 行 ,您必须执行更多操作。
Postgres中为每个学生提供 一个 行的简单解决方案是DISTINCT ON
:
SELECT *
FROM students s
JOIN (
SELECT DISTINCT ON (student_id) *
FROM grades
ORDER BY student_id, grade
) g USING (student_id);
最低恰好是这里的“最高”等级
要获得the ones with the highest value
(可能 复数 ),请使用窗口函数rank()
:
SELECT *
FROM students s
JOIN (
SELECT *, rank() OVER (PARTITION BY student_id ORDER BY grade) AS rnk
FROM grades
) g USING (student_id)
WHERE g.rnk = 1;