首页 > 代码库 > 在Sql Server中实现分组排名
在Sql Server中实现分组排名
比如我们有这样一个表,表名是table1,这个表里面存储了某班同学中考所有的科目成绩,假设如下:
姓名 | 科目 | 分数 |
李四 | 数学 | 100 |
李四 | 语文 | 85 |
张三 | 数学 | 95 |
张三 | 语文 | 90 |
这时候,老师要求查出每个科目同学的成绩排名,排名函数之前我们用的最多的就是row_number() over()了。但在默认情况下,这个排名函数是不分科目的,也就是不分组的,它会把所有的成绩按照高或低进行排名
select * ,ROW_NUMBER()OVER(ORDER BY [分数] desc) as id
from [table1] ORDER BY [课程]
from [table1] ORDER BY [课程]
执行得到的查询结果如下:
姓名 | 科目 | 分数 | 排名 |
李四 | 数学 | 100 | 1 |
张三 | 数学 | 95 | 2 |
张三 | 语文 | 90 | 3 |
李四 | 语文 | 85 | 4 |
这并不是我们想要的结果,因为数学和语文在一起排名是没有任何意义的。要实现每个科目内的排名,沈阳463整形医院程序给我们的建议就是row_number() over()中用到PARTITION BY关键字了,PARTITION BY的作用就是根据指定的某个列对结果集先进行分组,再排名,比如我们这个例子中需要对课程进行分组,那么就是PARTITION BY [课程],全部的sql如下:
select * ,ROW_NUMBER()OVER(PARTITION BY [课程] ORDER BY [分数] desc) as id
from [table1] ORDER BY [课程]
from [table1] ORDER BY [课程]
执行得到的查询结果如下:
姓名 | 科目 | 分数 | 排名 |
李四 | 数学 | 100 | 1 |
张三 | 数学 | 95 | 2 |
张三 | 语文 | 90 | 1 |
李四 | 语文 | 85 | 2 |
这个就是我们想要的结果了。
在Sql Server中实现分组排名
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。