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()函数按产品价格对产品进行排名:
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()函数应用于每个分区中的每一行,并在跨越分区的边界时重新初始化。

原文出自【易百教程】原文链接:https://www.yiibai.com/sqlserver/sql-server-rank-function.html





原文地址:https://www.cnblogs.com/xiaoyue1606bj/p/11021751.html