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函数 下一篇:无