MS SQL查询时自动给数据排名:RANK(),DENSE_RANK()

来源:互联网 发布:mac os server工具 编辑:程序博客网 时间:2024/05/17 02:53

    相信每人在开发应用过程中都遇到过这样的需求:针对所查询数据的某列进行排名。一般情况下我们有2种选择:

    1.将数据查询出来,在显示数据的时候给每条数据增加排名数字;

    2.使用SQL函数在查询时自动给数据排名。

    更多时候,我们推荐,在性能允许的情况下,让数据库承担它力所能及的逻辑处理,而让程序更专注于业务。这里我就把如何为使用SQL给数据排名。相信大家对ROW_NUMBER()函数并不陌生,在分页存储过程中应该没有少用,当然,它并不能满足我们的排名需求,但它的姊妹函数:RANK(),DENSE_RANK()函数却可以满足我们的需求。    

    RANK(),DENSE_RANK()的用法与ROW_NUMBER()相同,后面均接OVER():

    --按分数降序对成绩单进行排名

    SELECT RANK() OVER(ORDER BY Mark DESC) AS Rank, * FROM SchoolRecordCard WITH(NOLOCK)

    SELECT DENSE_RANK() OVER(ORDER BY Mark DESC) AS Rank, * FROM SchoolRecordCard WITH(NOLOCK)    

    如此,我们既在查询时使用排名函数自动对数据进行排名。但2者的排名规则却不相同:

    DENSE_RANK():返回结果集分区中行的排名,在排名中没有任何间断。行的排名等于所讨论行之前的所有排名数加一。

    RANK():返回结果集的分区内每行的排名。行的排名是相关行之前的排名数加一。

    也就是说,使用Rank()函数进行排名,假如排在第一,第二位的同学分数相同,则他们并列第一,他们下一位则是第三。而使用Dense_Rank()排名是不间断的,既第一第二位同学并列第一,第三位同学是第二。我们可以根据需求所提的排名规则来相应地选用排名函数。