这四个(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);
SELECT*
,RANK()OVER( --使用RANK函数进行排名
PARTITIONBYClassID --使用ClassID进行分组
ORDERBYMarkDESC) AS [RANK] --使用Mark进行排序
FROMStudent
注:Partition by进行分组,返回一个分组中的多条记录
特点:前两条的分数是相同的,则排名也相同,而第三条记录会根据当前的记录数来生成序号。
SELECT *
,DENSE_RANK() --使用DENSE_RANK()函数进行排名
OVER(PARTITIONBYClassID --使用ClassID进行分组
ORDERBYMark DESC)AS[Rank] --依据Mark列排序
FROM Student
特点:生成的序列号是连续的。
SELECT*
,NTILE(2)OVER(ORDERBYMark DESC)AS NewClass--这里是所以分成两组
FROMStudent
特点:对分数进行了大致的分组,这里涉及到了两种约定,也就是两种算法,暂时先不去延伸,以后肯定会遇到。
SELECT*
,ROW_NUMBER()OVER(
PARTITIONBYClassID
ORDERBYMark DESC)AS OrderID
FROM Student
特点:分数相等时,排名却不相等,依次连续排名。