2005每日一学]排名函数(3)
一:
排名函数为分区中的每一行返回一个排名值。根据所用的函数,某些行可能与其他行接收到相同的值。排名函数具有不确定性。
Transact-SQL 提供下列4个排名函数:
RANK NTILE
DENSE_RANK ROW_NUMBER
二:
RANK函数:
返回结果集的分区内每行的排名。行的排名是相关行之前的排名数加一。
Transact-SQL 语法约定
语法
RANK ( ) OVER ( [ < partition_by_clause > ] < order_by_clause > )
参数
< partition_by_clause >
将 FROM 子句生成的结果集划分成 RANK 函数适用的分区。
< order_by_clause >
确定将 RANK 值应用于分区中的行时所基于的顺序。
如果两个或多个行与一个排名关联,则每个关联行将得到相同的排名。例如,如果两位顶尖销售员具有相同的 SalesYTD 值,则他们将并列第一。由于已有两行排名在前,所以具有下一个最大 SalesYTD 的销售人员将排名第三。因此,RANK 函数并不总返回连续整数。
返回类型
bigint
示例:
CREATE TABLE T1
(
ID INT IDENTITY(1,1),
A INT
)
GO
INSERT INTO T1 SELECT 23
UNION ALL SELECT 34
UNION ALL SELECT 56
UNION ALL SELECT 56
UNION ALL SELECT 34
UNION ALL SELECT 56
UNION ALL SELECT 56
GO
SELECT ID,A, RANK() OVER(ORDER BY A DESC) AS RANK
FROM T1
ORDER BY RANK,ID
GO
DROP TABLE T1
GO
结果:
3 56 1
4 56 1
6 56 1
7 56 1
2 34 5
5 34 5
1 23 7
DENSE_RANK ( )函数:
大体与RANK()函数一样,区别在于
返回结果集分区中行的排名,在排名中没有任何间断。
把上面的例子查询改为:
SELECT ID,A, DENSE_RANK() OVER(ORDER BY A DESC) AS RANK
FROM T1
ORDER BY RANK,ID
GO
结果为:
3 56 1
4 56 1
6 56 1
7 56 1
2 34 2
5 34 2
1 23 3
可以看出区别来了吧!