📜  PostgreSQL – DISTINCT ON 表达式

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

PostgreSQL – DISTINCT ON 表达式

PostgreSQL 还提供了一个DISTINCT ON表达式,它与SELECT语句一起使用以从查询集结果中删除重复项,就像 DISTINCT 子句一样。除此之外,它还保留查询中每行重复项的“第一行”设定结果。

由于 SELECT 语句返回的行顺序是不可预测的,这意味着每组重复项的“第一行”也是不可预测的。将 ORDER BY子句与 DISTINCT ON(expression) 一起使用以按所需顺序生成结果集是一种很好的做法。

注意: DISTINCT ON 表达式必须始终匹配 ORDER BY 子句中最左边的表达式。

现在,让我们看几个例子以便更好地理解。为了举例,我们将创建一个示例数据库,如下所述:



使用如下所示的命令创建一个数据库(例如,Favourite_colours):

CREATE DATABASE Favourite_colours;

现在使用以下命令向数据库添加一个包含列(例如 id、colour_1 和 colour_2)的表(例如 my_table):

CREATE TABLE my_table(
    id serial NOT NULL PRIMARY KEY,
    colour_1 VARCHAR,
    colour_2 VARCHAR
);

现在使用以下命令在我们刚刚添加到数据库中的表中插入一些数据:

INSERT INTO my_table(colour_1, colour_2)
VALUES
    ('red', 'red'),
    ('red', 'red'),
    ('red', NULL),
    (NULL, 'red'),
    ('red', 'green'),
    ('red', 'blue'),
    ('green', 'red'),
    ('green', 'blue'),
    ('green', 'green'),
    ('blue', 'red'),
    ('blue', 'green'),
    ('blue', 'blue');

现在通过如下查询来检查一切是否符合预期:

SELECT
    id,
    colour_1,
    colour_2
FROM
    my_table;

如果一切都按预期进行,输出将如下所示:

由于我们的数据库很好,我们继续执行 SELECT DISTINCT ON 表达式。

示例 1:

SELECT
    DISTINCT ON
    (colour_1) colour_1,
    colour_2
FROM
    my_table
ORDER BY
    colour_1,
    colour_2;

输出:

示例 2:
注意查询集结果顺序的变化。

SELECT
    DISTINCT ON
    (colour_2) colour_2,
    colour_1
FROM
    my_table
ORDER BY
    colour_2,
    colour_1;

输出: