partition by关键字是分析性函数的一部分,它和聚合函数(如group by)不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,
数据库表结构 学生成绩表 UserGrade
sno int Checked 主键Id
sname varchar(50) Checked 学生名
project_name varchar(50) Checked 课程名
score int Checked 分数
01、把每个人学生的成绩按照升序排名 (思路:根据学生姓名分组 根据每个人成绩排序)
sql语句
select *,ROW_NUMBER() over( partition by sname order by score)排名
from student23
查询结果
Id sname project_name score 排名
1004 李四 数学 60 1
1005 李四 语文 80 2
1001 李四 英语 100 3
1007 王五 数学 30 1
1006 王五 语文 50 2
1003 王五 英语 50 3
1008 张三 英语 60 1
1000 张三 语文 80 2
1002 张三 数学 90 3
02、把每个学科的成绩分别进行排名 (思路:根据学科分组 根据成绩排序)
sql语句
select *,ROW_NUMBER() over( partition by Course order by Score )排名
from UserGrade
查询结果
Id Name Course Score 排名
1002 张三 数学 90 1
1004 李四 数学 60 2
1007 王五 数学 30 3
1001 李四 英语 100 1
1008 张三 英语 60 2
1003 王五 英语 50 3
1000 张三 语文 80 1
1005 李四 语文 80 2
1006 王五 语文 50 3
在mysql中,没有对应的partition by 的功能:
SELECT a.sname,a.sno,a.score,
IF( @className = a.project_name,@rank := @rank + 1,@rank :=1 ) AS rank,
(@className := a.project_name) project_name
FROM student23 a,
( select @rank :=0,@className := NULL ) b
ORDER BY a.project_name, a.score DESC ;
底下这个有点问题
在排名这一块出现全1,改了好几次还不行.