当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


PostgreSQL DENSE_RANK用法及代码示例


在 PostgreSQL 中,DENSE_RANK()函数用于为结果集分区内的每一行分配一个排名,排名值之间没有差距。这个DENSE_RANK() 为结果集的每个分区中的每一行分配一个等级。与 RANK() 函数不同的是,DENSE_RANK() 函数总是返回连续的排名值。对于每个分区,DENSE_RANK() 函数为具有相同值的行返回相同的排名

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

用法:
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:

首先,创建两个表命名产品展示 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;

输出:

相关用法


注:本文由纯净天空筛选整理自RajuKumar19大神的英文原创作品 PostgreSQL- DENSE_RANK Function。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。