Skip to main content

Ranking functions

Overview

Ranking functions return a ranking value for each row in a partition.

The ranking functions covered in this section are:

The clauses covered in this section are:

DENSE_RANK

DENSE_RANK returns the rank of each row within a result set partition, with no gaps in the ranking values. The rank of a specific row is one plus the number of distinct rank values that come before that specific row.

Return Type

Bigint

Syntax

DENSE_RANK() OVER (PARTITION BY column1 ORDER BY sort_column1)

Arguments

ArgumentDescriptionExample
OVERDetermines the partitioning and ordering of a rowset before the associated window function is applied. See here for further information.
PARTITION BYThis optional clause divides the result set into partitions or groups, and the ranking is applied within each partition separately. If omitted, the entire result set is treated as a single partition.Department
ORDER BYSpecifies the columns by which the data is sorted to determine the ranking order.Salary

Example 1

This example returns dense rank of customers in the [Documentation].[Customer] table, ordered by salary, within each department.

For example, it ranks Renald and Keith as the number one and number two ranked salaries in the Sales department respectively.

SELECT 
Name,
Department,
Salary,
DENSE_RANK() OVER(PARTITION BY Department ORDER BY Salary DESC) AS cust_dense_rank
FROM [Documentation].[Customer]

DENSE_RANK Example

NTILE

NTILE distributes the rows in an ordered partition into a specified number of groups. The groups are numbered, starting at one. For each row, NTILE returns the number of the group to which the row belongs.

Return Type

Bigint

Syntax

NTILE(expression) OVER (PARTITION BY column1 ORDER BY sort_column1)

Arguments

ArgumentDescriptionExample
expressionA positive integer expression for dividing rows into groups.2
OVERDetermines the partitioning and ordering of a rowset before the associated window function is applied. See here for further information.
PARTITION BYThis optional clause divides the result set into partitions to which the function is applied.Department
ORDER BYDetermines the order in which the NTILE values are assigned to the rows in a partition.Salary

Example

This example takes data from the [Documentation].[Customers] table and:

  • Partitions it by department
  • Orders it by Name
  • And divides it into 2 groups based on the NTILE expression.
SELECT 
Name,
Department,
NTILE(2) OVER(PARTITION BY Department ORDER BY Name DESC) AS ntile_groups
FROM [Documentation].[Customer]

PERCENT_RANK

PERCENT_RANK calculates the relative rank of a row within a group of rows. Use PERCENT_RANK to evaluate the relative standing of a value within a query result set or partition. It will return values between 0 and 1 to determine relative ranking.

Return Type

float

Syntax

PERCENT_RANK( ) OVER (PARTITION BY column1 ORDER BY sort_column1)

Arguments

ArgumentDescriptionExample
OVERDetermines the partitioning and ordering of a rowset before the associated window function is applied. See here for further information.
PARTITION BYThis optional clause divides the result set into partitions to which the function is applied.
ORDER BYDetermines the logical order in which the operation is performed.Salary

Example

This example ranks data from the Salary column of the [Documentation].[Customer] table. The results show that Carla has the highest rank of 1, with a 66,000$ salary, while Steve has the lowest rank of 0, with a 45,000$ salary.

SELECT 
Name,
Department,
PERCENT_RANK() OVER(ORDER BY Salary) AS percent_rank
FROM [Documentation].[Customer]

PERCENTRANK

RANK

RANK returns the rank of each row within a result set partition. The rank of a specific row is one plus the number of distinct rank values that come before that specific row.

Return Type

Bigint

Syntax

RANK() OVER (PARTITION BY column1 ORDER BY sort_column1)

Arguments

ArgumentDescriptionExample
OVERDetermines the partitioning and ordering of a rowset before the associated window function is applied. See here for further information.
PARTITION BYThis optional clause divides the result set into partitions or groups, and the ranking is applied within each partition separately. If omitted, the entire result set is treated as a single partition.Department
ORDER BYSpecifies the columns by which the data is sorted to determine the ranking order.Salary

Example

This example returns rank of customers in the [Documentation].[Customer] table, ordered by salary, within each department.

SELECT 
Name,
Department,
Salary,
RANK() OVER(PARTITION BY Department ORDER BY Salary DESC) AS cust_rank
FROM [Documentation].[Customer]

ROW_NUMBER

ROW_NUMBER numbers the output of a result set. More specifically, returns the sequential number of a row within a partition of a result set, starting at 1 for the first row in each partition.

ROW_NUMBER differs from RANK in that it numbers all rows sequentially (for example 1, 2, 3, 4, 5). RANK provides the same numeric value for ties (for example 1, 2, 2, 4, 5).

Return Type

Bigint

Syntax

ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY sort_column1)

Arguments

ArgumentDescriptionExample
OVERDetermines the partitioning and ordering of a rowset before the associated window function is applied. See here for further information.
PARTITION BYThis optional clause divides the result set into partitions to which the ROW_NUMBER function is applied
ORDER BYDetermines the sequence in which the rows are assigned their unique ROW_NUMBER within a specified partitionSalary

Example

SELECT 
Name,
Department,
Salary,
ROW_NUMBER() OVER(ORDER BY Salary DESC) AS cust_row
FROM [Documentation].[Customer]

ROWNUMBER

OVER

The OVER clause determines the partitioning and ordering of a rowset before the associated window function is applied.

Syntax

OVER ([PARTITION BY columns] [ORDER BY columns])

Arguments

ArgumentDescription
PARTITION BYThis subclause defines the groups into which the rows are divided.
ORDER BYThis clause defines the order of the records in the window frame.