SQL分组实现

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,改了好几次还不行.

猜你喜欢

转载自blog.csdn.net/OYY_90/article/details/82346309