SQL基础第四讲:分析函数之组内排序

SQL基础第四讲:分析函数之组内排序

看Python教程看的有点疲乏,还是写点东西吧~

为什么说是简讲呢,其实分析函数在工作中用到的地方也是非常多的,但是它可以实现的方面有很多,这里给大家讲三方面:1.分组内排序、2.分组内求聚合、3.计算行与行数据之间的偏移量。(ps:当你学会分析函数,相信我,你会爱上它!)

江湖惯例,先拿excel开刀,有这样一个场景,我们学校有8个班级,名字就叫一、二、三...班,每个班里有n名学生,现在老师想要看到,每个学生在班里面的排名和在整个年级的排名,大致模型就是这样:

在这里插入图片描述

从左侧变成右边这样,这个变换过程excel应该可以实现,但是我不会~,会玩excel的同学可以在公众号给作者留言,我也学习学习~

说回正题,我们还是先在数据库中创建表用于存储这些数据:

CREATE TABLE student(xh INT(10),bj CHAR(10),cj INT(10));
INSERT INTO student VALUES (20001 ,‘一班’, 510);
INSERT INTO student VALUES (20002 ,‘二班’, 630);
INSERT INTO student VALUES (20003 ,‘二班’, 200);
INSERT INTO student VALUES (20004 ,‘三班’, 350);
INSERT INTO student VALUES (20005 ,‘一班’, 500);
INSERT INTO student VALUES (20006 ,‘二班’, 150);
INSERT INTO student VALUES (20007 ,‘三班’, 140);
INSERT INTO student VALUES (20008 ,‘三班’, 140);
INSERT INTO student VALUES (20009 ,‘三班’, 120);

然后我们运行下面查询:

select xh,bj,cj,
row_number()over(order by cj desc,xh asc) as njpm,
row_number()over(partition by bj order by cj desc,xh asc) as bjpm
from student

在这里插入图片描述
可以看到,数据已经按照我们的规则,进行排序,在这里我们看到,其中 20008 和20007 学号的学生成绩相同,在这里做了个当成绩相同时,按照学号从大到小进行排序。

接下来我们来分析一下这个函数

row_number()over(partition by 分组列, order by 排序列)
前面的row_number()over是不变的,后面括号中的内容是关键,在这里我们需要对每个班级的学生成绩都进行排序,所以需要把每个班都分成一组一组,也就是partition by 后面跟上班级列,如果是按照年级分组,我们这里全表就一个年级的数据,所以不写分组,就是把全部数据当做一组。然后后面跟上我们的学生成绩,desc就是说是按照从大到小 也就是从高到低 进行排序,可以有多个排序字段,比如当成绩相同的时候,后面可以跟上按照学号从小到大进行排序,也就是asc 。分组和排序都一样,可以有0个或者多个字段。

但是有的老师可能想看到更加公平的结果,就是成绩相同的学生名次也相同,但是会产生一个新的问题,就是再往下的 20009号学生 排名多少,是按照上两名都是第二名 ,然后它是第三名,还是说这直接跨越第三名,把它排到第四名,这里就引出来row_number()的两个兄弟函数:dense_rank()和rank():

rank()over(partition by 分组列, order by 排序列)
—rank()可以对相同名次的学生进行跨越式的排序,比如 1 2 2 4
dense_rank()over(partition by 分组列, order by 排序列)
—dense_rank()的功能和rank()相似,但是会形成连续的排名, 比如 1 2 2 3
讲到这里,关于分析函数的组内排序讲解的基本结束,关于分析函数中聚合的使用和计算偏移量,我会在下一篇文章中进行讲解。大家对分析函数的组内排序还有什么疑惑的可以在公众号给我发送消息,我会回复大家,一起学习!!!

我先去看会Python视频~

刚开始编写文章,很多地方都有不足,希望以后可以为大家贡献出更好的文章,谢谢大家!

猜你喜欢

转载自blog.csdn.net/it325/article/details/107144093