日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL Server 2005中的ROW_NUMBER和RANK

發布時間:2023/12/10 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL Server 2005中的ROW_NUMBER和RANK 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
下面介紹兩個SQL Server 2005 中的新東東:
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 排序。

USE?AdventureWorks;
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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。