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

解释一下SQL中的排名问题

时间:2023-03-21 11:31:32 科技观察

我们先创建一个测试数据表ScoresWITHtAS(SELECT1StuID,70ScoreUNIONALLSELECT2,85UNIONALLSELECT3,85UNIONALLSELECT4,80UNIONALLSELECT5,74)SELECT*INTOScoresFROMt;SELECT*FROMScores结果如下:1.ROW_NUMBER()定义:ROW_NUMBER()函数的作用是对SELECT查询到的数据进行排序,并为每条数据加上序号。它不能用于对学生的成绩进行排名。一般用于逐页查询,比如查询10-100名学生的前10条查询。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()看一个例子:例子SELECTRANK()OVER(ORDERBYSCOREDESC)AS[RANK],*FROMScores;SELECTDENSE_RANK()OVER(ORDERBYSCOREDESC)AS[RANK],*FROMScores;结果:上面是RANK()的结果,下面是DENSE_RANK()的结果4、NTILE()的定义:NTILE()函数将有序分区中的行分布到指定数量的组中,并且每个组都有编号,编号从1开始,就像我们说的“分区”一样,分为几个区,有多少个区。结果:根据NTILE函数中的参数,将查询到的记录分成相等的分区。这些兄弟的介绍就结束了,有时间再介绍一下各组的排名。