Transact-SQL提供的4个排名函数: RANK(),DENSE_RANK(),ROW_NUMBER(),NTILE()

来源:互联网 发布:淘宝装修模块 编辑:程序博客网 时间:2024/05/14 23:26
--演示例题,建一个table
create table rankorder(
orderid 
int,
qty 
int
)
go
--插入数据
insert rankorder values(30,10)
insert rankorder values(10,10)
insert rankorder values(80,10)
insert rankorder values(40,10)
insert rankorder values(30,15)
insert rankorder values(30,20)
insert rankorder values(22,20)
insert rankorder values(21,20)
insert rankorder values(10,30)
insert rankorder values(30,30)
insert rankorder values(40,40)
go
--查询出各类排名
SELECT orderid,qty,
  ROW_NUMBER() 
OVER(ORDER BY qty) AS rownumber,
  RANK()       
OVER(ORDER BY qty) AS [rank],
  DENSE_RANK() 
OVER(ORDER BY qty) AS denserank ,
  NTILE(
3OVER(ORDER BY qty) AS [NTILE]
FROM rankorder
ORDER BY qty

--结果
--
ROW_NUMBER()是按qty由小到大逐一排名,不并列,排名连续
--
RANK()是按qty由小到大逐一排名,并列,排名不连续
--
DENSE_RANK()是按qty由小到大逐一排名,并列,排名连续
--
NTILE()是按qty由小到大分成3组逐一排名,并列,排名连续
orderid         qty    rownumber    rank    denserank    NTILE
          30        10                   1            1        1            1
          10        10                    2            1        1            1
           80        10                   3            1        1            1
           40        10                    4            1        1            1
            30        15                   5            5        2            2
             30        20                   6            6        3            2
             22        20                    7          6        3            2
             21        20                   8            6        3            2
             10        30                   9            9         4            3
              30        30                   10         9        4            3

              40        40                    11        11        5            3


一:RANK()

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

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

三:ROW_NUMBER()
  返回结果集分区内行的序列号,每个分区的第一行从 1 开始。
  ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。

四:NTILE()
  将有序分区中的行分发到指定数目的组中。各个组有编号,编号从一开始。对于每一个行,NTILE 将返回此行所属的组的编号。
如果分区的行数不能被 integer_expression 整除,则将导致一个成员有两种大小不同的组。按照 OVER 子句指定的顺序,较大的组排在较小的组前面。
例如,如果总行数是 53,组数是 5,则前三个组每组包含 11 行,其余两个组每组包含 10 行。
另一方面,如果总行数可被组数整除,则行数将在组之间平均分布。
例如,如果总行数为 50,有五个组,则每组将包含 10 行。


                                排名连续性      排名并列性
RANK()                  不一定连续       有并列
DENSE_RANK()     连续                  有并列
ROW_NUMBER()    连续                无并列
NTILE()                    连续                 有并列

0 0
原创粉丝点击