SQL Server Rank()函數

在本教學中,將學習如何使用SQL Server RANK()函數計算結果集的分區中每行的排名。

SQL Server RANK()函數簡介

RANK()函數是一個Window函數,它為結果集的分區中的每一行分配一個排名。

分區中具有相同值的行將獲得相同的排名。 分區中第一行的等級是1RANK()函數將綁定行的數量添加到綁定等級以計算下一行的等級,因此,等級可能不是連續的。

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()函數為結果集的分區中的每一行分配排名。


上一篇: SQL Server Window函數 下一篇:無