当前位置: 首页 > 科技观察

SQL中常用的四种排序函数,你知道几个?

时间:2023-03-17 11:51:43 科技观察

我们写SQL代码的时候,只要有排序,第一个想到的肯定是ORDERBY,所以很多小伙伴都觉得排序就是这么简单。今天我将介绍四个您不经常使用的排序功能。他们就是SQLServer排序中经常用到的ROW_NUMBER()、RANK()、DENSE_RANK()、NTILE()四大好兄弟。我们先创建一个测试数据表Scores:WITHtAS(SELECT1StuID,70ScoreUNIONALLSELECT2,85UNIONALLSELECT3,85UNIONALLSELECT4,80UNIONALLSELECT5,74)SELECT*INTOScoresFROMt;SELECT*FROMScores结果为如下:1.ROW_NUMBER()的定义:ROW_NUMBER()的作用是对SELECT查询到的数据进行排序,为每条数据加上序号,不能用于学生成绩排名,是一般用于分页查询,比如查询top10查询10-100名学生。1.1SELECTROW_NUMBER()OVER(ORDERBYSCOREDESC)AS[RANK],*FROMScores;结果如下:这里RANK是每个学生的排名顺序,根据Score,进行DESC逆序1.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()不同。如果出现相同的,则它们的排名相同。让我们看下面的示例:示例:SELECTROW_NUMBER()OVER(ORDERBYSCOREDESC)AS[RANK],*FROMScores;SELECTRANK()OVER(ORDERBYSCOREDESC)AS[RANK],*FROMScores;Result:上面是ROW_NUMBER()函数的结果,下面是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()我们来看例子:例子:SELECTRANK()OVER(ORDERBYSCOREDESC)AS[RANK],*FROMScores;SELECTDENSE_RANK()OVER(ORDERBYSCOREDESC)AS[RANK],*FROM分数;结果:上面是RANK()的结果,下面是DENSE_RANK()的结果。4、NTILE()的定义:NTILE()函数将有序分区中的行分布到指定数量的组中。每组有一个编号,编号从1.districts开始,会有多少个districts。选择NTILE(1)OVER(ORDERBYSCOREDESC)AS[RANK],*FROMScores;SELECTNTILE(2)OVER(ORDERBYSCOREDESC)AS[RANK],*FROMScores;SELECTNTILE(3)OVER(ORDERBYSCOREDESC)AS[RANK],*FROMScores;结果:查询到的记录按照NTILE函数中的参数进行均分。