The PERCENT_RANK
function returns the relative rank for each value.
Rankings can also be applied to groups (partitions) within the rows.
The values returned by PERCENT_RANK
are from 0 to 1.
PERCENT_RANK
is similar to the CUME_DIST function.
Calculate the relative rank of each product price.
SELECT ProductName, UnitPrice,
PERCENT_RANK() OVER(ORDER BY UnitPrice) AS 'Percent Rank'
FROM Product
ORDER BY UnitPrice
ProductName | UnitPrice | Percent Rank |
---|---|---|
Geitost | 2.50 | 0 |
Guaraná Fantástica | 4.50 | 0.012987012987013 |
Konbu | 6.00 | 0.025974025974026 |
Filo Mix | 7.00 | 0.038961038961039 |
Sir Rodney's Marmalade | 81.00 | 0.961038961038961 |
Mishi Kobe Niku | 97.00 | 0.974025974025974 |
Thüringer Rostbratwurst | 123.79 | 0.987012987012987 |
Côte de Blaye | 263.50 | 1 |
The percent rank starts at 0 and goes up to 1 (the last row).
Syntax of the PERCENT_RANK function.
PERCENT_RANK() OVER( PARTITION BY expression, ... ORDER BY expression, ... )
PARTITION BY expression
-- optional. Organizes rows into different groups where
the PERCENT_RANK
will be applied. If not specified, the entire result set is treated as a single group.
ORDER BY expression
-- specifies the sort order of the result set.
ORDER |
---|
Id |
OrderDate |
OrderNumber |
CustomerId |
TotalAmount |
CUSTOMER |
---|
Id |
FirstName |
LastName |
City |
Country |
Phone |
SELECT MONTH(OrderDate) AS Month,
CONCAT(FirstName, ' ', LastName) AS Customer, TotalAmount,
PERCENT_RANK() OVER(PARTITION BY MONTH(OrderDate)
ORDER BY TotalAmount) AS 'Percent Rank'
FROM [Order] O
JOIN Customer C ON O.CustomerId = C.Id
WHERE YEAR(OrderDate) = 2013
ORDER BY MONTH(OrderDate), TotalAmount
Order Month | Customer | TotalAmount | Percent Rank |
---|---|---|---|
1 | Paolo Accorti | 49.80 | 0 |
1 | Yoshi Latimer | 102.40 | 0.03125 |
1 | Maurizio Moroni | 192.00 | 0.03125 |
1 | Roland Mendel | 5796.00 | 0.9375 |
1 | Jytte Petersen | 11283.20 | 0.96875 |
1 | Jean Fresnière | 11493.20 | 1 |
2, 3, 4, ... 11 | |||
12 | Patricio Simpson | 12.50 | 0 |
12 | Paolo Accorti | 18.40 | 0.0212765957446809 |
12 | Pascale Cartrain | 28.00 | 0.0425531914893617 |
12 | Martín Sommer | 4035.80 | 0.957446808510638 |
12 | Marias Larsson | 4337.00 | 0.978723404255319 |
12 | Roland Mendel | 6984.50 | 1 |
ORDER |
---|
Id |
OrderDate |
OrderNumber |
CustomerId |
TotalAmount |
SELECT MONTH(OrderDate) AS 'Month',
SUM(TotalAmount) AS 'Monthly Sales',
PERCENT_RANK() OVER(ORDER BY SUM(TotalAmount))
AS 'Sales Distribution'
FROM [Order]
WHERE YEAR(OrderDate) = 2013
GROUP BY MONTH(OrderDate)
ORDER BY MONTH(OrderDate)
Month | Monthly Sales | Sales Distribution |
---|---|---|
1 | 66692.80 | 0.818181818181818 |
2 | 41207.20 | 0.181818181818182 |
3 | 39979.90 | 0.0909090909090909 |
4 | 55699.39 | 0.545454545454545 |
5 | 56823.70 | 0.636363636363636 |
6 | 39088.00 | 0 |
7 | 55464.93 | 0.454545454545455 |
8 | 49981.69 | 0.363636363636364 |
9 | 59733.02 | 0.727272727272727 |
10 | 70328.50 | 0.909090909090909 |
11 | 45913.36 | 0.272727272727273 |
12 | 77476.26 | 1 |
50% of the sales from year 2013 are greater than 50,000.