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函數 下一篇:無