我们写SQL代码的时候,只要有排序,第一个想到的肯定是ORDERBY,所以很多小伙伴都觉得排序就是这么简单。今天我将介绍四个您不经常使用的排序功能。他们就是SQLServer排序中经常用到的ROW_NUMBER()、RANK()、DENSE_RANK()、NTILE()四大好兄弟。我们先创建一个测试数据表ScoresWITHtAS(SELECT1StuID,70ScoreUNIONALLSELECT2,85UNIONALLSELECT3,85UNIONALLSELECT4,80UNIONALLSELECT5,74)SELECT*INTOScoresFROMt;SELECT*FROMScores结果如下:1、ROW_NUMBER()的定义:ROW_NUMBER()的作用是将查询到的数据从SELECT中进行排序,每条数据都加上一个序号。它不能用于对学生的成绩进行排名。一般用于逐页查询,比如查询前10名,查询10-100名学生。1.1SELECTROW_NUMBER()OVER(ORDERBYSCOREDESC)AS[RANK],*FROMScores;(温馨提示:可以左右滑动代码)结果如下:这里RANK是每个学生排名的顺序,DESC是根据Score1.2倒过来得到第二名的分数信息SELECT*FROM(SELECTROW_NUMBER()OVER(ORDERBYSCOREDESC)AS[RANK],*FROMScores)tWHEREt.RANK=2;结果:这里使用的思路是分页查询的思路,然后在原来的sql层外设置SELECTWHEREt.RANK>=1ANDt.RANK<=3是否只是获取前三名学生的成绩信息?2、RANK()的定义:RANK()函数,顾名思义,可以对某个字段进行排名。这和ROW_NUMBER()有什么区别?ROW_NUMBER()正在排序。当有相同年级的学生时,ROW_NUMBER()会依次对他们进行排序。它们的序列号不同,但Rank()不同。如果出现相同的,则它们的排名相同。让我们看下面的例子:函数,以下是RANK()函数的结果。当有两个同年级的学生时,就会发生变化。RANK()是1-1-3-4-5,而ROW_NUMBER()还是1-2-3-4-5,这就是RANK()和ROW_NUMBER()的区别3、DENSE_RANK()的定义:DENSE_RANK()函数也是一个排序函数,类似于RANK(),对字段进行排序。那么它和RANK()有什么区别呢?特别是对于结果相同的情况,DENSE_RANK()排名是连续的,RANK()是跳跃排名。一般来说,使用的排名函数是RANK()下面看一个例子:上面是RANK()的结果,下面是DENSE_RANK()4的结果。NTILE()的定义:NTILE()函数是将有序分区中的行分布到指定数量的组中。每个组都有一个编号,编号从1开始。就像我们说的“分区”,分成几个区,有多少个区。结果:根据NTILE函数中的参数,将查询到的记录分成相等的分区。
