RANK()函數是一個Window函數,它為結果集的分區中的每一行分配一個排名。
分區中具有相同值的行將獲得相同的排名。 分區中第一行的等級是1。 RANK()函數將綁定行的數量添加到綁定等級以計算下一行的等級,因此,等級可能不是連續的。
RANK()函數的語法如下所示:
RANK() OVER ( [PARTITION BY partition_expression, ... ] ORDER BY sort_expression [ASC | DESC], ... )
在這個語法中:
- 首先,
PARTITION BY子句划分應用該函數的結果集分區的行。 - 其次,
ORDER BY子句指定應用該函數每個分區中行的邏輯排序順序。
RANK()函數對於求解前N個和后N個報表很有用。
SQL Server RANK()說明
首先,創建一個名為sales.rank_demo的新表,其中包含一列:
CREATE TABLE sales.rank_demo ( v VARCHAR(10) );
其次,向sales.rank_demo表中插入一些行:
INSERT INTO sales.rank_demo(v) VALUES('A'),('B'),('B'),('C'),('C'),('D'),('E');
第三,從sales.rank_demo表中查詢數據:
SELECT v FROM sales.rank_demo;
第四,使用ROW_NUMBER()為sales.rank_demo表的結果集中的行分配排名:
SELECT v, RANK () OVER ( ORDER BY v ) rank_no FROM sales.rank_demo;
執行上面查詢語句,得到以下結果:
從輸出中清楚地顯示,第二和第三行接收相同的等級,因為它們具有相同的值
B。第四和第五行得到等級
4,因為
RANK()函數跳過等級
3並且它們也具有相同的值(
4)。
SQL Server RANK()函數示例
下面將使用
production.products表來演示如何使用RANK()函數:
1. 在結果集中使用RANK()函數示例
以下示例使用
以下示例使用
RANK()函數按產品價格對產品進行排名:
1 SELECT 2 product_id, 3 product_name, 4 list_price, 5 RANK () OVER ( 6 ORDER BY list_price DESC 7 ) price_rank 8 FROM 9 production.products;
執行上面查詢語句,得到以下結果:

在此示例中,因為未指定PARTITION BY子句,所以RANK()函數將整個結果集視為單個分區。
RANK()函數為結果集中的每一行分配一個排名,按價格從高到低排序。
2. 在分區上使用RANK()函數示例
此示例使用RANK()函數按每個品牌的價格為每個產品分配排名,並返回排名小於或等於三的產品:
1 SELECT * FROM ( 2 SELECT 3 product_id, 4 product_name, 5 brand_id, 6 list_price, 7 RANK () OVER ( 8 PARTITION BY brand_id 9 ORDER BY list_price DESC 10 ) price_rank 11 FROM 12 production.products 13 ) t 14 WHERE price_rank <= 3;
執行上面查詢語句,得到以下結果:

在這個例子中:
- 首先,
PARTITION BY子句按品牌ID將產品划分為分區。 - 其次,
ORDER BY子句按價格對每個分區中的產品進行排序。 - 第三,外部查詢返回排名值小於或等於
3的產品。
RANK()函數應用於每個分區中的每一行,並在跨越分區的邊界時重新初始化。
