查询每个班级数学最好的学生

sql table

班级 学生 科目 分数

一班 小红 数学 90

一班 小红 语文 51

一班 小红 英语 70

一班 小刚 数学 68

一班 小刚 语文 53

一班 小刚 英语 74

二班 小明 数学 84

二班 小明 语文 63

二班 小明 英语 76

二班 小楚 数学 84

二班 小楚 语文 75

二班 小楚 英语 25

这个怎么做啊?  

查询每个班级数学最好的学生  

SQL 帆软用户77r8vnVzDX 发布于 2023-1-29 13:35
1min目标场景问卷 立即参与
回答问题
悬赏:0 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共3回答
最佳回答
0
shirokoLv6资深互助
发布于2023-1-29 13:50(编辑于 2023-1-29 15:17)

select a.* from table a

left join 

(select 班级,科目,max(分数) 最高分 FROM table

where 科目='数学' group by 班级,科目) b on a.班级=b.班级 and a.科目=b.科目 and a.分数=b.最高分

where b.科目 is not null

image.png

  • 帆软用户77r8vnVzDX 帆软用户77r8vnVzDX(提问者) 这样写有问题,只会求出一个班级的 写法一: select b.class, b.students, b.km ,b.fs ,b.rk from ( select a.*,rank() over(partition by class order by fs desc) as rk from classa a where km=\'数学\') b where b.rk=1; 写法二: with temp as( select a.*,rank() over(partition by class order by fs desc) as \"数学最好的学生\" from classa a where km=\'数学\') select * from temp where 数学最好的学生=1;
    2023-01-29 14:36 
  • shiroko shiroko 回复 帆软用户77r8vnVzDX(提问者) 抱歉,刚才漏写了一个group by了
    2023-01-29 15:17 
最佳回答
0
墨白哦Lv6见习互助
发布于2023-1-29 14:50

第一种,mysql 直接MAX就行

SELECT 

班级,

学生,

科目,

MAX(分数)分数

FROM table1

WHERE

科目='数学'

GROUP BY

班级

第二种,SQLSERVER RANK()开窗函数 具体看需求取

SELECT 

班级,

学生,

科目,

分数,

dense_rank() over(partition by 班级 order by 分数) as sort

FROM table1

WHERE

科目='数学'

最佳回答
0
用户CKn4B8768Lv2见习互助
发布于2023-1-29 20:53(编辑于 2023-1-29 20:53)

我用的是sql server 

select * from 

(select row_number()over(partition  by [科目],[班级] order by [分数] desc ) 排名  , 

* from table

where [科目]='数学' ) tt   --先按科目和班级分组对分数进行排序

where [排名]<=1  --筛选出小于1的序号

  • 4关注人数
  • 381浏览人数
  • 最后回答于:2023-1-29 20:53
    请选择关闭问题的原因
    确定 取消
    返回顶部