SQL Server 2005中的ROW_NUMBER和RANK
ROW_NUMBER
返回結(jié)果集分區(qū)內(nèi)行的序列號(hào),每個(gè)分區(qū)的第一行從 1 開(kāi)始。
語(yǔ)法:
ROW_NUMBER ( ) ????OVER ( [ <partition_by_clause> ] <order_by_clause> )
備注:
ORDER BY 子句可確定在特定分區(qū)中為行分配唯一 ROW_NUMBER 的順序。
參數(shù):
<partition_by_clause>
將 FROM 子句生成的結(jié)果集劃入應(yīng)用了 ROW_NUMBER 函數(shù)的分區(qū)。
<order_by_clause>
確定將 ROW_NUMBER 值分配給分區(qū)中的行的順序。
返回類型:
bigint
示例:
以下示例將根據(jù)年初至今的銷售額,返回 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
以下示例將返回行號(hào)為 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
返回結(jié)果集的分區(qū)內(nèi)每行的排名。行的排名是相關(guān)行之前的排名數(shù)加一。
語(yǔ)法:
RANK ( )????OVER ( [ < partition_by_clause > ] < order_by_clause > )
備注:
如果兩個(gè)或多個(gè)行與一個(gè)排名關(guān)聯(lián),則每個(gè)關(guān)聯(lián)行將得到相同的排名。例如,如果兩位頂尖銷售員具有同樣的 SalesYTD 值,他們將并列第一。由于已有兩行排名在前,所以具有下一個(gè)最大 SalesYTD 的銷售人員將排名第三。因此,RANK 函數(shù)并不總返回連續(xù)整數(shù)。
用于整個(gè)查詢的排序順序決定了行在結(jié)果集中的顯示順序。這也隱含了行在每個(gè)分區(qū)中的排名。
參數(shù):
< partition_by_clause >
將 FROM 子句生成的結(jié)果集劃分為要應(yīng)用 RANK 函數(shù)的分區(qū)。
< order_by_clause >
確定將 RANK 值應(yīng)用于分區(qū)中的行時(shí)所基于的順序。
返回類型:
bigint
示例:
以下示例按照數(shù)量對(duì)清單中的產(chǎn)品進(jìn)行了排名。行集按 LocationID 分區(qū),按 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
下面是和朋友討論的一個(gè)小例子,不知道對(duì)不對(duì),大家指教啊:
一個(gè)記錄集{1,1,1,4,4,4,7,7,7,7,7,7,7,7,7}
當(dāng)用 rank between 1 and 10 過(guò)濾 {1,1,1,4,4,4,7,7,7,7,7,7,7,7,7}時(shí),就會(huì)得到超過(guò)十條的記錄
用rownumber between 1 and 10得到的是{1,1,1,4,4,4,7,7,7,7}
也就是說(shuō):
用rank就是同樣的記錄看作是進(jìn)行一個(gè)排名,得到的有可能大于10條
例如:比賽中第一名1個(gè),第二名1個(gè),第三名3個(gè),下一個(gè)人就不是第四名而是第六名
?
| 人員<?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就是從這個(gè)記錄集中選出結(jié)果,例如前4名我們得到的是如下結(jié)果:
?
| 人員 | 名次 |
| A | 1 |
| B | 2 |
| C | 3 |
| D | 3 |
| E | 3 |
| F | 6 |
而rownumber不管重復(fù)僅得到4條而已,結(jié)果如下:
?
| 人員 | 名次 |
| A | 1 |
| B | 2 |
| C | 3 |
| D | 3 |
轉(zhuǎn)載于:https://www.cnblogs.com/Bear-Study-Hard/archive/2006/02/09/327723.html
總結(jié)
以上是生活随笔為你收集整理的SQL Server 2005中的ROW_NUMBER和RANK的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第五十二篇 仿真电路简单说明multis
- 下一篇: linux cmake编译源码,linu