zl程序教程

您现在的位置是:首页 >  后端

当前栏目

ROW_NUMBERSQLServer2005的LIMIT功能实现(ROW_NUMBER()排序函数)

排序 实现 函数 number 功能 limit row
2023-06-13 09:14:34 时间
语法:
ROW_NUMBER()OVER([<partition_by_clause>]<order_by_clause>)

备注:
ORDERBY子句可确定在特定分区中为行分配唯一ROW_NUMBER的顺序。

参数:
<partition_by_clause>将FROM子句生成的结果集划入应用了ROW_NUMBER函数的分区。
<order_by_clause>确定将ROW_NUMBER值分配给分区中的行的顺序。有关详细信息,请参阅ORDERBY子句(Transact-SQL)。

返回类型:
bigint

类似于MySQL的LIMIT功能语法实例:
复制代码代码如下:

SELECT*FROM(SELECTROW_NUMBER()OVER(ORDERBYidASC)ASrownum,*FROMMyTable)ASitemsWHEREitems.rownumBETWEEN20AND30;


sqlROW_NUMBER()排序函数

1使用row_number()函数进行编号:如
复制代码代码如下:

selectemail,customerID,ROW_NUMBER()over(orderbypsd)asrowsfromQT_Customer

原理:先按psd进行排序,排序完后,给每条数据进行编号。
2.在订单中按价格的升序进行排序,并给每条记录进行排序
代码如下:
复制代码代码如下:
selectDID,customerID,totalPrice,ROW_NUMBER()over(orderbytotalPrice)asrowsfromOP_Order

3.统计出每一个各户的所有订单并按每一个客户下的订单的金额升序排序,同时给每一个客户的订单进行编号。这样就知道每个客户下几单了。


代码如下:
复制代码代码如下:selectROW_NUMBER()over(partitionbycustomerIDorderbytotalPrice)asrows,customerID,totalPrice,DIDfromOP_Order
4.统计每一个客户最近下的订单是第几次下的订单。

代码如下:
复制代码代码如下:
withtabsas
(
selectROW_NUMBER()over(partitionbycustomerIDorderbytotalPrice)asrows,customerID,totalPrice,DIDfromOP_Order
)
selectMAX(rows)as"下单次数",customerIDfromtabsgroupbycustomerID

5.统计每一个客户所有的订单中购买的金额最小,而且并统计改订单中,客户是第几次购买的。
如图:

上图:rows表示客户是第几次购买。

思路:利用临时表来执行这一操作
1.先按客户进行分组,然后按客户的下单的时间进行排序,并进行编号。
2.然后利用子查询查找出每一个客户购买时的最小价格。
3.根据查找出每一个客户的最小价格来查找相应的记录。
代码如下:
复制代码代码如下:
withtabsas
(
selectROW_NUMBER()over(partitionbycustomerIDorderbyinsDT)asrows,customerID,totalPrice,DIDfromOP_Order
)
select*fromtabs
wheretotalPricein
(
selectMIN(totalPrice)fromtabsgroupbycustomerID
)

5.筛选出客户第一次下的订单。

思路。利用rows=1来查询客户第一次下的订单记录。
代码如下:
复制代码代码如下:
withtabsas
(
selectROW_NUMBER()over(partitionbycustomerIDorderbyinsDT)asrows,*fromOP_Order
)
select*fromtabswhererows=1
select*fromOP_Order

6.rows_number()可用于分页
思路:先把所有的产品筛选出来,然后对这些产品进行编号。然后在where子句中进行过滤。

7.注意:在使用over等开窗函数时,over里头的分组及排序的执行晚于“where,groupby,orderby”的执行。
如下代码:
复制代码代码如下:
select
ROW_NUMBER()over(partitionbycustomerIDorderbyinsDT)asrows,
customerID,totalPrice,DID
fromOP_OrderwhereinsDT>"2011-07-22"

以上代码是先执行where子句,执行完后,再给每一条记录进行编号。