快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

SQL中组内排序的示例分析

这篇文章主要介绍了SQL中组内排序的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

创新互联专业为企业提供益阳网站建设、益阳做网站、益阳网站设计、益阳网站制作等企业网站建设、网页设计与制作、益阳企业网站模板建站服务,10年益阳做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

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

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

SQL中组内排序的示例分析

    从左侧变成右边这样,这个变换过程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);

SQL中组内排序的示例分析

    然后我们运行下面查询:

  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

SQL中组内排序的示例分析

    可以看到,数据已经按照我们的规则,进行排序,在这里我们看到,其中 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

感谢你能够认真阅读完这篇文章,希望小编分享的“SQL中组内排序的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持创新互联,关注创新互联行业资讯频道,更多相关知识等着你来学习!


新闻标题:SQL中组内排序的示例分析
文章网址:http://6mz.cn/article/jpidgs.html

其他资讯