数据库技术之rank、dense_rank、ntile、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进行分组,返回一个分组中的多条记录

数据库技术之rank、dense_rank、ntile、row_number函数的区别_第1张图片

特点:前两条的分数是相同的,则排名也相同,而第三条记录会根据当前的记录数来生成序号。

二、DENSE_RANK函数

SELECT *

 ,DENSE_RANK()                --使用DENSE_RANK()函数进行排名

  OVER(PARTITIONBYClassID    --使用ClassID进行分组

  ORDERBYMark DESC)AS[Rank] --依据Mark列排序

FROM Student

数据库技术之rank、dense_rank、ntile、row_number函数的区别_第2张图片

特点:生成的序列号是连续的。

三、NTILE()函数

SELECT*

 ,NTILE(2)OVER(ORDERBYMark DESC)AS NewClass--这里是所以分成两组

FROMStudent

数据库技术之rank、dense_rank、ntile、row_number函数的区别_第3张图片

特点:对分数进行了大致的分组,这里涉及到了两种约定,也就是两种算法,暂时先不去延伸,以后肯定会遇到。

四、ROW_NUMBER函数

  SELECT*

  ,ROW_NUMBER()OVER(

  PARTITIONBYClassID

  ORDERBYMark DESC)AS OrderID

 FROM Student

数据库技术之rank、dense_rank、ntile、row_number函数的区别_第4张图片

特点:分数相等时,排名却不相等,依次连续排名。

总结:

   通过对这几张图片的分析,明显的可以看出如下区别:

  1、RANK函数生成的序列号可能不是连续的,DENSE_RANK函数则是连续的。
  2、NTILE函数可以对序号进行分组处理
  3、ROW_NUMBER函数查询的结果行提供连续的整数值,但与DENSE_RANK函数相比,不会出现序号相同的情况。
     只是初步的对这四个函数的总结,随着自己知识的增加,在对这四个函数进行深入的学习。

你可能感兴趣的:(数据库)