SQL Server 2005中的ROW_NUMBER和RANK
ROW_NUMBER
返回結果集分區內行的序列號,每個分區的第一行從 1 開始。
語法:
ROW_NUMBER ( ) ????OVER ( [ <partition_by_clause> ] <order_by_clause> )
備注:
ORDER BY 子句可確定在特定分區中為行分配唯一 ROW_NUMBER 的順序。
參數:
<partition_by_clause>
將 FROM 子句生成的結果集劃入應用了 ROW_NUMBER 函數的分區。
<order_by_clause>
確定將 ROW_NUMBER 值分配給分區中的行的順序。
返回類型:
bigint
示例:
以下示例將根據年初至今的銷售額,返回 AdventureWorks 中銷售人員的 ROW_NUMBER。 USE?AdventureWorks
GO
SELECT?c.FirstName,?c.LastName,?ROW_NUMBER()?OVER(ORDER?BY?SalesYTD?DESC)?AS?'Row?Number',?s.SalesYTD,?a.PostalCode
FROM?Sales.SalesPerson?s?JOIN?Person.Contact?c?on?s.SalesPersonID?=?c.ContactID
JOIN?Person.Address?a?ON?a.AddressID?=?c.ContactID
WHERE?TerritoryID?IS?NOT?NULL?AND?SalesYTD?<>?0
以下示例將返回行號為 50 到 60(含)的行,并以 OrderDate 排序。 USE?AdventureWorks;
GO
WITH?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;
RANK
返回結果集的分區內每行的排名。行的排名是相關行之前的排名數加一。
語法:
RANK ( )????OVER ( [ < partition_by_clause > ] < order_by_clause > )
備注:
如果兩個或多個行與一個排名關聯,則每個關聯行將得到相同的排名。例如,如果兩位頂尖銷售員具有同樣的 SalesYTD 值,他們將并列第一。由于已有兩行排名在前,所以具有下一個最大 SalesYTD 的銷售人員將排名第三。因此,RANK 函數并不總返回連續整數。
用于整個查詢的排序順序決定了行在結果集中的顯示順序。這也隱含了行在每個分區中的排名。
參數:
< partition_by_clause >
將 FROM 子句生成的結果集劃分為要應用 RANK 函數的分區。
< order_by_clause >
確定將 RANK 值應用于分區中的行時所基于的順序。
返回類型:
bigint
示例:
以下示例按照數量對清單中的產品進行了排名。行集按 LocationID 分區,按 Quantity 排序。
GO
SELECT?i.ProductID,?p.Name,?i.LocationID,?i.Quantity,?RANK()?OVER?(PARTITION?BY?i.LocationID?order?by?i.Quantity)?as?RANK
FROM?Production.ProductInventory?i?JOIN?Production.Product?p?
ON?i.ProductID?=?p.ProductID
ORDER?BY?p.Name
GO
下面是和朋友討論的一個小例子,不知道對不對,大家指教啊:
一個記錄集{1,1,1,4,4,4,7,7,7,7,7,7,7,7,7}
當用 rank between 1 and 10 過濾 {1,1,1,4,4,4,7,7,7,7,7,7,7,7,7}時,就會得到超過十條的記錄
用rownumber between 1 and 10得到的是{1,1,1,4,4,4,7,7,7,7}
也就是說:
用rank就是同樣的記錄看作是進行一個排名,得到的有可能大于10條
例如:比賽中第一名1個,第二名1個,第三名3個,下一個人就不是第四名而是第六名
?
| 人員<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> | 名次 |
| A | 1 |
| B | 2 |
| C | 3 |
| D | 3 |
| E | 3 |
| F | 6 |
| G | 7 |
| H | 8 |
| I | 9 |
| J | 10 |
如果用rank就是從這個記錄集中選出結果,例如前4名我們得到的是如下結果:
?
| 人員 | 名次 |
| A | 1 |
| B | 2 |
| C | 3 |
| D | 3 |
| E | 3 |
| F | 6 |
而rownumber不管重復僅得到4條而已,結果如下:
?
| 人員 | 名次 |
| A | 1 |
| B | 2 |
| C | 3 |
| D | 3 |
轉載于:https://www.cnblogs.com/Bear-Study-Hard/archive/2006/02/09/327723.html
總結
以上是生活随笔為你收集整理的SQL Server 2005中的ROW_NUMBER和RANK的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第五十二篇 仿真电路简单说明multis
- 下一篇: SQL函数大全