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()
函数应用于每个分区中的每一行,并在跨越分区的边界时重新初始化。