PostgreSQL – DISTINCT ON 表达式
PostgreSQL 还提供了一个DISTINCT ON表达式,它与SELECT语句一起使用以从查询集结果中删除重复项,就像 DISTINCT 子句一样。除此之外,它还保留查询中每行重复项的“第一行”设定结果。
Syntax:
SELECT DISTINCT ON (column_1) column_alias, column_2 FROM table_name ORDER BY column_1, column_2;
由于 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;
输出: