RANK (Transact-SQL)RANK (Transact-SQL)

適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database はいAzure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance はいAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics はいParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data Warehouse適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database はいAzure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance はいAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics はいParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data Warehouse

結果セットのパーティション内の各行の順位を返します。Returns the rank of each row within the partition of a result set. 行の順位は、その行より上にある順位の数に 1 を加えたものです。The rank of a row is one plus the number of ranks that come before the row in question.

ROW_NUMBER と RANK は似ています。ROW_NUMBER and RANK are similar. ROW_NUMBER は、すべての行に順番に番号を付けます (例: 1、2、3、4、5)。ROW_NUMBER numbers all rows sequentially (for example 1, 2, 3, 4, 5). RANK は同順位に対して同じ番号を付けます (例: 1、2、2、4、5)。RANK provides the same numeric value for ties (for example 1, 2, 2, 4, 5).

注意

RANK は、クエリの実行時に計算される一時的な値です。RANK is a temporary value calculated when the query is run. 番号をテーブルに保持するには、「IDENTITY プロパティ」と「SEQUENCE」をご覧ください。To persist numbers in a table, see IDENTITY Property and SEQUENCE.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )  

注意

SQL Server 2014 以前の Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

引数Arguments

OVER ( [ partition_by_clause ] order_by_clause )OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause は、FROM 句で生成された結果セットをパーティションに分割します。このパーティションに関数が適用されます。partition_by_clause divides the result set produced by the FROM clause into partitions to which the function is applied. 指定しない場合、関数ではクエリ結果セットのすべての行を 1 つのグループとして扱います。If not specified, the function treats all rows of the query result set as a single group. order_by_clause は、関数を適用する前にデータの順序を決定します。order_by_clause determines the order of the data before the function is applied. order_by_clause が必要です。The order_by_clause is required. OVER 句の <rows or range clause/> は RANK 関数では指定できません。The <rows or range clause/> of the OVER clause cannot be specified for the RANK function. 詳細については、を参照してください。 OVER 句 (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

戻り値の型Return Types

bigintbigint

解説Remarks

複数の行が 1 つの順位を分け合う場合は、それぞれの行に同じ順位が付けられます。If two or more rows tie for a rank, each tied row receives the same rank. たとえば、上位 2 人の販売員の SalesYTD 値が同じである場合は、両方に順位 1 が付けられます。For example, if the two top salespeople have the same SalesYTD value, they are both ranked one. SalesYTD が次に高い販売員には、順位 3 が付けられます。順位のより高い行が 2 つあるためです。The salesperson with the next highest SalesYTD is ranked number three, because there are two rows that are ranked higher. そのため、RANK 関数は連続した整数を返すとは限りません。Therefore, the RANK function does not always return consecutive integers.

クエリ全体に使用される並べ替え順によって、結果セットにおける行の順序が決まります。The sort order that is used for the whole query determines the order in which the rows appear in a result set.

RANK は非決定的です。RANK is nondeterministic. 詳細については、「 決定的関数と非決定的関数」を参照してください。For more information, see Deterministic and Nondeterministic Functions.

Examples

A.A. パーティション内の行に順位を付けるRanking rows within a partition

次の例では、指定された在庫場所の在庫内の製品を数量に応じて順位付けしています。The following example ranks the products in inventory the specified inventory locations according to their quantities. 結果セットは LocationID によってパーティションに分割され、Quantity によって論理的に順序付けされます。The result set is partitioned by LocationID and logically ordered by Quantity. 494 と 495 の製品が同じ数量であることを確認します。Notice that products 494 and 495 have the same quantity. これらは数量が同じなので、両方とも順位が 1 位になっています。Because they are tied, they are both ranked one.

USE AdventureWorks2012;  
GO  
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity  
    ,RANK() OVER   
    (PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS Rank  
FROM Production.ProductInventory AS i   
INNER JOIN Production.Product AS p   
    ON i.ProductID = p.ProductID  
WHERE i.LocationID BETWEEN 3 AND 4  
ORDER BY i.LocationID;  
GO  

結果セットは次のようになります。Here is the result set.

ProductID   Name                   LocationID   Quantity Rank  
----------- ---------------------- ------------ -------- ----  
494         Paint - Silver         3            49       1  
495         Paint - Blue           3            49       1  
493         Paint - Red            3            41       3  
496         Paint - Yellow         3            30       4  
492         Paint - Black          3            17       5  
495         Paint - Blue           4            35       1  
496         Paint - Yellow         4            25       2  
493         Paint - Red            4            24       3  
492         Paint - Black          4            14       4  
494         Paint - Silver         4            12       5  
 (10 row(s) affected)  

B.B. 結果セット内のすべての行に順位を付けるRanking all rows in a result set

次の例では、給与に順位を付け、トップ 10 の従業員を返します。The following example returns the top ten employees ranked by their salary. PARTITION BY 句が指定されていないため、RANK 関数は結果セットのすべての行に適用されます。Because a PARTITION BY clause was not specified, the RANK function was applied to all rows in the result set.

USE AdventureWorks2012  
SELECT TOP(10) BusinessEntityID, Rate,   
       RANK() OVER (ORDER BY Rate DESC) AS RankBySalary  
FROM HumanResources.EmployeePayHistory AS eph1  
WHERE RateChangeDate = (SELECT MAX(RateChangeDate)   
                        FROM HumanResources.EmployeePayHistory AS eph2  
                        WHERE eph1.BusinessEntityID = eph2.BusinessEntityID)  
ORDER BY BusinessEntityID;  

結果セットは次のようになります。Here is the result set.

BusinessEntityID Rate                  RankBySalary  
---------------- --------------------- --------------------  
1                125.50                1  
2                63.4615               4  
3                43.2692               8  
4                29.8462               19  
5                32.6923               16  
6                32.6923               16  
7                50.4808               6  
8                40.8654               10  
9                40.8654               10  
10               42.4808               9  

例: Azure Synapse AnalyticsAzure Synapse AnalyticsParallel Data WarehouseParallel Data WarehouseExamples: Azure Synapse AnalyticsAzure Synapse Analytics and Parallel Data WarehouseParallel Data Warehouse

C: パーティション内の行に順位を付けるC: Ranking rows within a partition

次の例では、売上合計に応じて販売区域ごとに販売担当者をランク付けします。The following example ranks the sales representatives in each sales territory according to their total sales. 行セットは SalesTerritoryGroup によってパーティション分割され、SalesAmountQuota によって並べ替えられます。The rowset is partitioned by SalesTerritoryGroup and sorted by SalesAmountQuota.

-- Uses AdventureWorks  
  
SELECT LastName, SUM(SalesAmountQuota) AS TotalSales, SalesTerritoryRegion,  
    RANK() OVER (PARTITION BY SalesTerritoryRegion ORDER BY SUM(SalesAmountQuota) DESC ) AS RankResult  
FROM dbo.DimEmployee AS e  
INNER JOIN dbo.FactSalesQuota AS sq ON e.EmployeeKey = sq.EmployeeKey  
INNER JOIN dbo.DimSalesTerritory AS st ON e.SalesTerritoryKey = st.SalesTerritoryKey  
WHERE SalesPersonFlag = 1 AND SalesTerritoryRegion != N'NA'  
GROUP BY LastName, SalesTerritoryRegion;  

結果セットは次のようになります。Here is the result set.

LastName          TotalSales     SalesTerritoryRegion  RankResult
----------------  -------------  -------------------  --------
Tsoflias          1687000.0000   Australia            1
Saraiva           7098000.0000   Canada               1
Vargas            4365000.0000   Canada               2
Carson            12198000.0000  Central              1
Varkey Chudukatil 5557000.0000   France               1
Valdez            2287000.0000   Germany              1
Blythe            11162000.0000  Northeast            1
Campbell          4025000.0000   Northwest            1
Ansman-Wolfe      3551000.0000   Northwest            2
Mensa-Annan       2753000.0000   Northwest            3
Reiter            8541000.0000   Southeast            1
Mitchell          11786000.0000  Southwest            1
Ito               7804000.0000   Southwest            2
Pak               10514000.0000  United Kingdom       1

参照See Also

DENSE_RANK (Transact-SQL) DENSE_RANK (Transact-SQL)
ROW_NUMBER (Transact-SQL) ROW_NUMBER (Transact-SQL)
NTILE (Transact-SQL) NTILE (Transact-SQL)
順位付け関数 (Transact-SQL) Ranking Functions (Transact-SQL)
組み込み関数 (Transact-SQL)Built-in Functions (Transact-SQL)