sql 分组后排名,ROW_NUMBER()OVER()函数的使用

比如我们有这样一个表,表名是table1,这个表里面存储了某班同学中考所有的科目成绩,假设如下:
姓名科目分数
李四数学100
李四语文85
张三数学95
张三语文90

这时候,老师要求查出每个科目同学的成绩排名,排名函数之前我们用的最多的就是row_number() over()了。但在默认情况下,这个排名函数是不分科目的,也就是不分组的,它会把所有的成绩按照高或低进行排名
select  table1.* ,ROW_NUMBER()OVER(ORDER BY [分数] desc) as id 
from [table1] ORDER BY [课程]

执行得到的查询结果如下: 
姓名科目分数排名
李四数学1001
张三数学952
张三语文903
李四语文854

这并不是我们想要的结果,因为数学和语文在一起排名是没有任何意义的。要实现每个科目内的排名,我们就要在row_number() over()中用到PARTITION BY关键字了,PARTITION BY的作用就是根据指定的某个列对结果集先进行分组,再排名,比如我们这个例子中需要对课程进行分组,那么就是PARTITION BY [课程],全部的sql如下:
select  table1.* ,ROW_NUMBER()OVER(PARTITION BY [课程] ORDER BY [分数] desc) as id 
from [table1] ORDER BY [课程]

执行得到的查询结果如下: 
姓名科目分数排名
李四数学1001
张三数学952
张三语文901
李四语文852

这个就是我们想要的结果了。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值