mysql - 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
可以做到这一点的查询是什么?
解决方案
在标准 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
推荐阅读
- ruby - 使用 Thor 创建嵌套子命令
- python - 将占位符添加到 Django 中的表单字段
- apache-nifi - NIFI——如何从 updateattributes 访问自定义变量到 groovy 脚本
- javascript - 使用未知键和未知值解析对象内部的数组
- reactjs - 如何从“semantic-ui-react”作为 Formik 道具为 Dropdown 编写 setFieldValue setFieldTouched 函数
- c# - 我可以使用 AutoMapper 将一个 int 映射到对象列表吗?
- java - 使用 jsoup 的 Java 网络爬虫问题
- javascript - 如何聚合 JSON 以显示每个相同值的计数
- python - 计算不预测置信度值的模型的平均精度
- javascript - 在 Flux 设计模式中放置预状态设置突变的位置