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

说说SQL中的排序问题

时间:2023-03-22 17:34:32 科技观察

本文转载自微信公众号《SQL数据库开发》,作者,平凡的世界。转载本文请联系SQL数据库开发公众号。今天给大家介绍一下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是每个学生的排名顺序,根据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()不同。如果出现相同的,则它们的排名相同。让我们看下面的例子:函数,以下是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],*FROMScores;结果:上面是RANK()的结果,下面是DENSE_RANK()的结果4、NTILE()的定义:NTILE()函数将有序分区中的行分布到指定数量的组中,并且每个组都有编号,编号从1开始,就像我们说的“分区”一样,分为几个区,有多少个区。结果:根据NTILE函数中的参数,将查询到的记录分成相等的分区。这些兄弟的介绍就结束了,有时间再介绍一下各组的排名。