常用SQL——Row_Number

admin 发表于 [MySQL] 分类,标签: SQL
0

 

        搞开发这行的,工作中难免会遇到这个不会的那个不会的,不会怎么办,问Google,Baidu呀,可是查过用过以后呢,过段时间又给忘记了,其实搞开发的并没有必要要记很多的东西,关键是遇到问题后知道怎么去查,知道去那里找,俗话说好记性不如烂笔头,还是记下来的好,以后如果再遇到这种问题,直接找到这篇文章就可以了。

        随着SQL Server的不断升级,其功能也在不断的完善,Oracle之所以会有那么多的忠实用户,追其原因无外乎其性能的稳定,SQL语句的成熟。随着微软的不断发展,Oracle上有的好东西,SQL也在不断的引进,本文和大家一起说一下在SQL SEVER2005中引入的ROW_NUMBER函数。

        

返回结果集分区内行的序列号,每个分区的第一行从 1 开始.

 
ROW_NUMBER ( )     OVER ( [ <partition_by_clause> ] <order_by_clause> )


<partition_by_clause >

将 FROM  子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。若要了解 PARTITION BY 语法,请参阅 OVER 子句 (Transact-SQL)

<order_by_clause >

确定将 ROW_NUMBER 值分配给分区中的行的顺序。有关详细信息,请参阅 ORDER BY 子句 (Transact-SQL) 。当在排名函数中使用 <order_by_clause> 时,不能用整数表示列。


ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。

A. 返回销售人员的行号

以下示例将根据年初至今的销售额,返回 AdventureWorks2008R2  中销售人员的 ROW_NUMBER

 
SELECT FirstName, LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', SalesYTD, PostalCode FROM Sales.vSalesPersonWHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;


B. 返回行的子集

以下示例将返回行号为 50  到 60  的行(包含这两行),并按 OrderDate  进行排序。

 
USE AdventureWorks2008R2;GOWITH OrderedOrders AS(    SELECT SalesOrderID, OrderDate,    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'    FROM Sales.SalesOrderHeader ) SELECT * FROM OrderedOrders WHERE RowNumber BETWEEN 50 AND 60;这种方法可以方便快捷的实现分页查询操作。


C. 将 ROW_NUMBER () 与 PARTITION 一起使用

以下示例显示了将 ROW_NUMBER  函数与 PARTITION BY  参数结合使用的情况。

SELECT FirstName, LastName, ROW_NUMBER() OVER(PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS 'Row Number', SalesYTD, PostalCode FROM Sales.vSalesPersonWHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;






发表我的评论