在本教程中,将学习如何使用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()
函数为结果集的分区中的每一行分配排名。