从具有相同主键的特定行数开始,如何选择某列中具有最高值的行?

时间:2015-03-16 19:56:01

标签: sql postgresql greatest-n-per-group

我有一张学生桌和一张等级表。

  • 学生的列 student_id(主键),姓名,date_of_birth,地址,电子邮件,级别
  • 成绩包含 student_id(主要/外键),course_id(主要/外键),成绩

“成绩”看起来像这样:

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';

这是错的,我知道为什么,但我不知道从哪里开始。

2 个答案:

答案 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;