使用排名和數據列集函式
排名和數據列集函式不是純量函式,因為它們不會傳回單一值。 這些函式接受一組數據列做為輸入,並傳回一組數據列做為輸出。
次序函數
排名函數可讓您對使用者定義的數據列集執行計算。 這些函式包括排名、位移、匯總和分佈函式。
此範例會使用 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
依價格排序
749
Road-150 Red, 62
3578.27
1
750
Road-150 Red, 44
3578.27
1
751
Road-150 紅色, 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;
此查詢的結果可能如下所示:
類別
產品
ListPrice
依價格排序
Bib-Shorts
男子連身短褲 (S)
89.99
1
Bib-Shorts
男子吊帶短褲,M
89.99
1
自行車架
拖車式車架 - 可容納 4 輛自行車
120
1
腳踏車停車架
All-Purpose 自行車站
159
1
瓶子和籠子
Mountain Bottle Cage
9.99
1
瓶子和籠子
Road Bottle Cage
8.99
2
瓶子和籠子
水瓶 - 30 盎司。
4.99
3
Bottom Brackets
HL 下括弧
121.49
1
Bottom Brackets
ML 中軸
101.24
2
Bottom Brackets
LL 中軸
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 參考檔。