使用次序函數和資料列集函數

已完成

順位和資料列集函數不會傳回單一值,所以不是純量函式。 這些函式會接受一組資料列作為輸入,然後傳回一組資料列作為輸出。

次序函數

次序函數可讓您計算使用者定義的一組資料列。 這些函數包括次序、位移、彙總和分佈函數。

此範例使用 RANK 函數,根據 ListPrice 來計算順位,其中最高價格排名為 1:

SELECT TOP 100 ProductID, Name, ListPrice,
RANK() OVER(ORDER BY ListPrice DESC) AS RankByPrice
FROM Production.Product AS p
ORDER BY RankByPrice;

查詢結果可能如下所示:

ProductID

名稱

ListPrice

RankByPrice

749

Road-150 Red, 62

3578.27

1

750

Road-150 Red, 44

3578.27

1

751

Road-150 Red, 48

3578.27

1

771

Mountain-100 Silver, 38

3399.99

4

772

Mountain-100 Silver, 42

3399.99

4

775

Mountain-100 Black, 38

3374.99

6

...

...

...

...

OVER

您可以使用 OVER 子句來定義資料內的分割區或群組。 例如,下列查詢延伸前一個範例,計算每個類別內產品的價格順位。

SELECT c.Name AS Category, p.Name AS Product, ListPrice,
  RANK() OVER(PARTITION BY c.Name ORDER BY ListPrice DESC) AS RankByPrice
FROM Production.Product AS p
JOIN Production.ProductCategory AS c
ON p.ProductCategoryID = c.ProductcategoryID
ORDER BY Category, RankByPrice;

此查詢的結果可能如下所示:

類別

Products

ListPrice

RankByPrice

Bib-Shorts

Men's Bib-Shorts, S

89.99

1

Bib-Shorts

Men's Bib-Shorts, M

89.99

1

Bike Racks

Hitch Rack - 4-Bike

120

1

Bike Stands

All-Purpose Bike Stand

159

1

自行車水壺架

Mountain Bottle Cage

9.99

1

自行車水壺架

Road Bottle Cage

8.99

2

自行車水壺架

Water Bottle - 30 oz.

4.99

3

五通軸心

HL Bottom Bracket

121.49

1

五通軸心

ML Bottom Bracket

101.24

2

五通軸心

LL Bottom Bracket

53.99

3

...

...

...

...

注意

請注意,數個資料列有相同的順位,而有些值會被跳過。 這是因為我們只使用 RANK。 根據需求,您可能會想要避免在相同的排名值上產生繫結。 您可以視需要使用其他函式、DENSE_RANK、NTILE 和 ROW_NUMBER 控制順位值。 如需這些函式的詳細資料,請參閱 Transact-SQL 參考文件

資料列集函式

資料列集函數傳回可在 FROM 子句中當做資料來源的虛擬資料表。 這些函數接受資料列集函數本身特有的參數。 包括 OPENDATASOURCE、OPENQUERY、OPENROWSET、OPENXML 和 OPENJSON。

OPENDATASOURCE、OPENQUERY 和 OPENROWSET 函數可讓您將查詢傳遞到遠端資料庫伺服器。 遠端伺服器接著會傳回一組結果資料列。 例如,下列查詢使用 OPENROWSET,從名為 SalesDB 的 SQL Server 執行個體中取得查詢的結果。

SELECT a.*
FROM OPENROWSET('SQLNCLI', 'Server=SalesDB;Trusted_Connection=yes;',
    'SELECT Name, ListPrice
    FROM AdventureWorks.Production.Product') AS a;

若要使用遠端伺服器,則在您執行查詢的 SQL Server 執行個體中,您必須啟用一些進階選項。

OPENXML 和 OPENJSON 函數可讓您查詢 XML 或 JSON 格式的結構化資料,然後將值擷取至表格式資料列集。

資料列集函數的詳細探索已超出本課程模組的範圍。 如需詳細資訊,請參閱 Transact-SQL 參考文件