📜  PostgreSQL- DENSE_RANK函数

📅  最后修改于: 2022-05-13 01:57:14.804000             🧑  作者: Mango

PostgreSQL- DENSE_RANK函数

PostgreSQL,所述DENSE_RANK()函数用于一个结果集的一个分区中分配一个等级到每一行,在分级值没有间隙。 DENSE_RANK () 为结果集的每个分区中的每一行分配一个等级。与 RANK()函数, DENSE_RANK ()函数总是返回连续的秩值。对于每个分区, DENSE_RANK ()函数为具有相同值的行返回相同的等级

下面显示了 DENSE_RANK()函数的语法:

Syntax:
DENSE_RANK() OVER (
    [PARTITION BY partition_expression, ... ]
    ORDER BY sort_expression [ASC | DESC], ...
)

DENSE_RANK ()函数应用于 PARTITION BY 子句定义的每个分区中的每一行,按 ORDER BY 子句指定的排序顺序。跨越分区边界时,它会重置排名。 PARTITION BY 子句是可选的。如果跳过它,DENSE_RANK()函数会将整个结果集视为单个分区。

示例 1:

首先,创建一个名为dense_ranks的表 有一列:



CREATE TABLE dense_ranks (
    c VARCHAR(10)
);

现在插入一些数据:

INSERT INTO dense_ranks(c)
VALUES('A'), ('A'), ('B'), ('C'), ('C'), ('D'), ('E');

现在dense_ranks查询 桌子:

SELECT c from dense_ranks;

这将导致以下描述:

第四,使用DENSE_RANK()函数为结果集中的每一行分配一个等级:

SELECT
    c,
    DENSE_RANK() OVER (
        ORDER BY c
    ) dense_rank_number
FROM
    dense_ranks;

输出:

示例 2:

首先,创建两个名为products 的 product_groups 演示:

CREATE TABLE product_groups (
    group_id serial PRIMARY KEY,
    group_name VARCHAR (255) NOT NULL
);

CREATE TABLE products (
    product_id serial PRIMARY KEY,
    product_name VARCHAR (255) NOT NULL,
    price DECIMAL (11, 2),
    group_id INT NOT NULL,
    FOREIGN KEY (group_id) REFERENCES product_groups (group_id)
);

现在向表中插入一些数据:

INSERT INTO product_groups (group_name)
VALUES
    ('Smartphone'),
    ('Laptop'),
    ('Tablet');

INSERT INTO products (product_name, group_id, price)
VALUES
    ('Microsoft Lumia', 1, 200),
    ('HTC One', 1, 400),
    ('Nexus', 1, 500),
    ('iPhone', 1, 900),
    ('HP Elite', 2, 1200),
    ('Lenovo Thinkpad', 2, 700),
    ('Sony VAIO', 2, 700),
    ('Dell Vostro', 2, 800),
    ('iPad', 3, 700),
    ('Kindle Fire', 3, 150),
    ('Samsung Galaxy Tab', 3, 200);

以下语句使用DENSE_RANK ()函数按标价对产品进行排名:

SELECT
    product_id,
    product_name,
    price,
    DENSE_RANK () OVER ( 
        ORDER BY price DESC
    ) price_rank 
FROM
    products;

输出: