SQL Server Dense_rank()函数

在本教程中,将学习如何使用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;

执行上面查询语句,得到以下结果:

dense_rank()函数

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()函数为结果集的分区中的每一行分配排名,并且排名值没有间隙。


上一篇: SQL Server Window函数 下一篇:无