rank、dense_rank、row_number函数的区别
这四个(RANK、DENSE_RANK、NTILE、ROW_NUMBER)函数,都是用来对数据库中的数据进行排名的,在他们的功能各有千秋。
下面介绍一下这四个函数的功能和用法:
首先创建一个Student表
CREATETABLEStudent
(
StudentIDint,
ClassIDint,
Markint
);
然后在表中插入数据
INSERTINTOStudent VALUES(1,1,90);
INSERTINTOStudent VALUES(2,1,84);
INSERTINTOStudent VALUES(3,1,80);
INSERTINTOStudent VALUES(5,1,90);
INSERTINTOStudent VALUES(6,1,76);
INSERTINTOStudent VALUES(7,1,89);
INSERTINTOStudent VALUES(11,2,90);
INSERTINTOStudent VALUES(12,2,82);
INSERTINTOStudent VALUES(13,2,80);
INSERTINTOStudent VALUES(14,2,80);
INSERTINTOStudent VALUES(15,2,90);
INSERTINTOStudent VALUES(16,2,75);
INSERT INTO Student VALUES(17,2,89);
一、RANK函数
SELECT*
,RANK()OVER( --使用RANK函数进行排名
PARTITIONBYClassID --使用ClassID进行分组
ORDERBYMarkDESC) AS [RANK] --使用Mark进行排序
FROMStudent
注:Partition by进行分组,返回一个分组中的多条记录
特点:前两条的分数是相同的,则排名也相同,而第三条记录会根据当前的记录数来生成序号。
二、DENSE_RANK函数
SELECT *
,DENSE_RANK() --使用DENSE_RANK()函数进行排名
OVER(PARTITIONBYClassID --使用ClassID进行分组
ORDERBYMark DESC)AS[Rank] --依据Mark列排序
FROM Student
特点:生成的***是连续的。
三、NTILE()函数
SELECT*
,NTILE(2)OVER(ORDERBYMark DESC)AS NewClass--这里是所以分成两组
FROMStudent
特点:对分数进行了大致的分组,这里涉及到了两种约定,也就是两种算法,暂时先不去延伸,以后肯定会遇到。
四、ROW_NUMBER函数
SELECT*
,ROW_NUMBER()OVER(
PARTITIONBYClassID
ORDERBYMark DESC)AS OrderID
FROM Student
特点:分数相等时,排名却不相等,依次连续排名。
总结:
通过对这几张图片的分析,明显的可以看出如下区别:
1、RANK函数生成的***可能不是连续的,DENSE_RANK函数则是连续的。
2、NTILE函数可以对序号进行分组处理
3、ROW_NUMBER函数查询的结果行提供连续的整数值,但与DENSE_RANK函数相比,不会出现序号相同的情况。
只是初步的对这四个函数的总结,随着自己知识的增加,在对这四个函数进行深入的学习。
---------------------
作者:李维涛
来源:****
原文:https://blog.****.net/lwt976647637/article/details/48229365
版权声明:本文为博主原创文章,转载请附上博文链接!