在本教程中,将学习如何使用SQL Server DENSE_RANK()
函数为结果集的分区中的每一行分配排名,并且排名值没有间隙。
SQL Server DENSE_RANK()函数简介
DENSE_RANK()
是一个Windows函数,它为结果集的分区中的每一行分配一个排名。 与RANK()
函数不同,DENSE_RANK()
函数返回连续的排名值。 如果每个分区中的行具有相同的值,则它们将获得相同的排名。
DENSE_RANK()
函数的语法如下:
DENSE_RANK() OVER (
[PARTITION BY partition_expression, ... ]
ORDER BY sort_expression [ASC | DESC], ...
)
DENSE_RANK()
函数以ORDER BY
子句定义的指定顺序应用于PARTITION BY
子句定义的每个分区的行。它会在划分分区边界时重置等级。
PARITION BY
子句是可选的。如果省略它,该函数会将整个结果集视为单个分区。
SQL Server DENSE_RANK()函数描述
以下语句创建一个名为dense_rank_demo
的新表,并在该表中插入一些行:
CREATE TABLE sales.dense_rank_demo (
v VARCHAR(10)
);
INSERT INTO sales.dense_rank_demo(v)
VALUES('A'),('B'),('B'),('C'),('C'),('D'),('E');
SELECT
*
FROM
sales.dense_rank_demo;
以下语句使用DENSE_RANK()
和RANK()
函数为结果集的每一行分配一个排名:
SELECT
v,
DENSE_RANK() OVER (
ORDER BY v
) my_dense_rank,
RANK() OVER (
ORDER BY v
) my_rank
FROM
sales.dense_rank_demo;
执行上面查询语句,得到以下结果:
SQL Server DENSE_RANK()函数示例
下面将使用production.products
表来演示DENSE_RANK()
函数:
1. SQL Server DENSE_RANK()在结果集中使用示例
以下示例使用DENSE_RANK()
函数按价格对产品进行排名:
SELECT
product_id,
product_name,
list_price,
DENSE_RANK () OVER (
ORDER BY list_price DESC
) price_rank
FROM
production.products;
执行上面查询语句,得到以下结果:
2. SQL Server DENSE_RANK()在分区上使用示例
以下语句按价格对每个类别中的产品进行排名。它按照价格仅返回每个类别的前3
个产品。
SELECT * FROM (
SELECT
product_id,
product_name,
category_id,
list_price,
DENSE_RANK () OVER (
PARTITION BY category_id
ORDER BY list_price DESC
) price_rank
FROM
production.products
) t
WHERE price_rank < 3;
执行上面查询语句,得到以下结果:
在本教程中,学习了如何使用SQL Server DENSE_RANK()
函数为结果集的分区中的每一行分配排名,并且排名值没有间隙。