在本教學中,將學習如何使用SQL Server RANK()
函數計算結果集的分區中每行的排名。
SQL Server RANK()函數簡介
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()
函數按產品價格對產品進行排名:
SELECT
product_id,
product_name,
list_price,
RANK () OVER (
ORDER BY list_price DESC
) price_rank
FROM
production.products;
執行上面查詢語句,得到以下結果:
在此示例中,因為未指定PARTITION BY
子句,所以RANK()
函數將整個結果集視為單個分區。
RANK()
函數為結果集中的每一行分配一個排名,按價格從高到低排序。
2. 在分區上使用RANK()函數示例
此示例使用RANK()
函數按每個品牌的價格為每個產品分配排名,並返回排名小於或等於三的產品:
SELECT * FROM (
SELECT
product_id,
product_name,
brand_id,
list_price,
RANK () OVER (
PARTITION BY brand_id
ORDER BY list_price DESC
) price_rank
FROM
production.products
) t
WHERE price_rank <= 3;
執行上面查詢語句,得到以下結果:
在這個例子中:
- 首先,
PARTITION BY
子句按品牌ID將產品劃分為分區。 - 其次,
ORDER BY
子句按價格對每個分區中的產品進行排序。 - 第三,外部查詢返回排名值小於或等於
3
的產品。
RANK()
函數應用於每個分區中的每一行,並在跨越分區的邊界時重新初始化。
在本教學中,學習了如何使用SQL Server RANK()
函數為結果集的分區中的每一行分配排名。