首页 > 解决方案 > SQL查找每组中第N个值对应的行

问题描述

我有一个表A如下:

name   course  grade
Bob      C1     12
Bob      C2     13
Bob      C3     23
Bob      C4     17 
James    C2     15
James    C6     27
Nick     C5    18
Nick     C1    16
Nick     C3    22
Nick     C2    32
Nick     C7    19

我想要一个查询,该查询可以返回每个学生的学生姓名和课程编号,该学生对应于该学生的第三高年级。例如,在上表中,Bob 的第三高成绩是 17,因此课程编号是 C4。此外,由于 James 的课程少于 3 门,因此他的课程不应包含在查询结果中。换句话说,查询结果应该显示如下:

name course_id
Bob    C4
Nick   C7

可以做到这一点的查询是什么?

标签: mysqlsqlgroup-by

解决方案


在标准 SQL 中,可以使用窗口函数来执行此操作:

select name, course
from (
   select name, course, grade, 
          dense_rank() over (partition by name order by grade) as rnk
   from grades
) t
where rnk = 3

在线示例:https ://rextester.com/YOHZB50840

MySQL 在线示例:https ://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=3f9ff551c89f6941dbf8e424e6dfda56


推荐阅读