使用Sql Server2005中新添加的row_number()和rank()返回行号或排名

本文介绍了SQL中的排名函数row_number()和rank()的用法及区别,通过实例展示了如何使用这些函数来为查询结果分配行号,同时对比了SET ROWCOUNT与TOP在限制查询结果数量上的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

row_number()和rank()都可以返回行号列

语法:
RANK ( )OVER ( [ < partition_by_clause > ] < order_by_clause > ) row_number ( )
OVER ( [ < partition_by_clause > ] < order_by_clause >

参数:
< partition_by_clause > 将 FROM 子句生成的结果集划分为要应用 RANK 函数的分区。
< order_by_clause >确定将 RANK 值应用于分区中的行时所基于的顺序。有关详细信息,请参阅 ORDER BY 子句 (Transact-SQL)
例子:


SELECT
cate_id,news_id,rank()
over(orderbycate_iddesc)asrow_num
FROMnews
cate_id news_id row_num
-------- ----------- ------------
24 11482 1
24 11502 2
23 11503 3
23 11486 4
23 11487 5
22 11492 6
22 11493 7
22 11494 8
21 11495 9
21 11496 10


SELECT
cate_id,news_id,rank()
over(orderbycate_iddesc)asrow_num
FROMnews
cate_id news_id row_num
-------- ----------- ------------
24 11482 1
24 11502 1
23 11503 3 前面两行所以为3
23 11486 3 orderby在cate_id上,cate_id=23的行号都为3
23 11487 3
22 11492 6
22 11493 6
22 11494 6
21 11495 9 前面9行所以为9
21 11496 9

row_number和rank的主要区别是rank返回的是唯一的行号,而rank返回的不一定是唯一值,它更具在orderby列上具有相同的值会返回一样的行号,某行的行号是相关行之前的行数加1。


set rowcount n
使 SQL Server 在返回指定的行数之后停止处理查询。(限制返回的行数)
注意:在 SQL Server 的下一个版本中,使用 SET ROWCOUNT 将不会影响 DELETE、INSERT 和 UPDATE 语句。在新的开发工作中,避免将 SET ROWCOUNT 语句与 DELETE、INSERT 和 UPDATE 语句一起使用,并计划修改当前使用该语句的应用程序。另外,对于当前使用 SET ROWCOUNT 的 DELETE、INSERT 和 UPDATE 语句,建议您使用 TOP 语法重写它们。有关详细信息,请参阅 DELETE (Transact-SQL)INSERT (Transact-SQL)UPDATE (Transact-SQL)

setrowcount5;
SELECT
cate_id,news_id,rank()
over(orderbycate_iddesc)asrow_num
FROMnews
cate_id news_id row_num
-------- ----------- ------------
24 11482 1
24 11502 2
23 11503 3
23 11486 4
23 11487 5

要将此选项设置为 off 以便返回所有的行,请将 SET ROWCOUNT 指定为 0。

TOP 和 SET ROWCOUNT
限制结果集大小的另一种方法是在执行一个语句之前执行 SET ROWCOUNT n 语句。SET ROWCOUNT 与 TOP 的不同之处体现在下列方面:

SET ROWCOUNT 限制适用于计算 ORDER BY 后在结果集中生成行。如果指定了 ORDER BY,SELECT 语句将在从根据指定的 ORDER BY 分类进行排序的某个值集中选择 n 行后结束。


TOP 子句适用于指定了该子句的单个 SELECT 语句。SET ROWCOUNT 将一直有效,直到执行另一个 SET ROWCOUNT 语句,例如 SET ROWCOUNT 0 将关闭该选项。

重要事项:
使用 SET ROWCOUNT 不会影响 SQL Server 下一版本中的 DELETE、INSERT 和 UPDATE 语句。应避免在新的开发工作中将 SET ROWCOUNT 与 DELETE、INSERT 和 UPDATE 语句一起使用,并计划修改当前使用它的应用程序。建议重写当前使用 SET ROWCOUNT 的 DELETE、INSERT 和 UPDATE 语句以使用 TOP。

尽管 SET ROWCOUNT 对于 SELECT 语句的影响仍未改变,但将 TOP 与 SELECT 一起使用要优于使用 SET ROWCOUNT,原因如下:


当 SELECT、INSERT、UPDATE 和 DELETE 语句影响指定的行数时,SET ROWCOUNT 将导致这些语句中的大多数停止处理。此行为也适用于内部触发器的激发。


作为 SELECT 语句的一部分,查询优化器可以使用 TOP 子句中 expression 的值作为生成查询的执行计划的一部分。由于 SET ROWCOUNT 在执行查询的语句外使用,因此它的值不能用于生成查询的查询计划。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值