了解 PostgreSQL 中的 DISTINCT(附带示例)

免费试用

立即开始增强您的 PostgreSQL。

Abstract light blue triangle over a black background

作者:Timescale 团队

在 PostgreSQL 或 TimescaleDB 中,您可能经常需要从查询结果中消除重复的行以获得一组唯一的记录。PostgreSQL 中的 DISTINCT 子句就是为此而设计的,可确保您的结果仅包含唯一行。

PostgreSQL DISTINCT 语法

DISTINCT 子句的基本语法如下:

SELECT DISTINCT column1, column2, ...
FROM table;

您还可以使用 DISTINCT ON 根据指定的列或列集返回每组重复项的第一行:

SELECT DISTINCT ON (column1) column1, column2, ...
FROM table
ORDER BY column1, column2, ...;

示例表

让我们考虑一个具有以下结构和数据的表 weather_data

CREATE TABLE weather_data (
    id SERIAL PRIMARY KEY,
    device_id VARCHAR(50),
    temperature NUMERIC,
    humidity NUMERIC,
    wind_speed NUMERIC,
    recorded_at TIMESTAMP
);

INSERT INTO weather_data (device_id, temperature, humidity, wind_speed, recorded_at) VALUES ('device_1', 22.5, 55.0, 12.5, '2023-01-15 08:00:00'), ('device_2', 21.0, 60.0, 10.0, '2023-01-15 08:05:00'), ('device_1', 23.0, 57.0, 11.0, '2023-01-15 08:10:00'), ('device_2', 19.5, 62.0, 8.0, '2023-01-15 08:15:00'), ('device_1', 20.0, 59.0, 9.5, '2023-01-15 08:20:00'), ('device_3', 24.0, 54.0, 13.0, '2023-01-15 08:25:00'), ('device_2', 18.5, 63.0, 7.5, '2023-01-15 08:30:00'), ('device_3', 22.0, 55.5, 12.0, '2023-01-15 08:35:00'), ('device_1', 21.5, 58.0, 10.5, '2023-01-15 08:40:00'), ('device_3', 23.5, 53.0, 13.5, '2023-01-15 08:45:00');

使用 DISTINCT 的实际示例

让我们深入研究一些示例,以了解 DISTINCT 子句的实际应用。

示例 1:从单个列中选择不同的值

假设我们要从 weather_data 表中检索所有唯一的 device_id 值。我们可以使用 DISTINCT 子句来实现这一点:

SELECT DISTINCT device_id
FROM weather_data;

结果

 device_id 
-----------
 device_1  
 device_2  
 device_3  

此查询返回 weather_data 表中的一组唯一 device_id 值。

示例 2:选择多列的不同组合

现在,假设我们要检索 device_idhumidity 的唯一组合。我们可以在多列上使用 DISTINCT 子句:

SELECT DISTINCT device_id, humidity
FROM weather_data;

结果

 device_id | humidity 
-----------+----------
 device_1  |     55.0 
 device_2  |     60.0 
 device_1  |     57.0 
 device_2  |     62.0 
 device_1  |     59.0 
 device_3  |     54.0 
 device_2  |     63.0 
 device_3  |     55.5 
 device_1  |     58.0 
 device_3  |     53.0 

此查询返回 weather_data 表中 device_idhumidity 的唯一组合。

示例 3:使用 DISTINCT ON 获取每组的第一行

假设我们要检索每个设备的第一个记录温度。我们可以使用 DISTINCT ON 来实现这一点:

SELECT DISTINCT ON (device_id) device_id, temperature, recorded_at
FROM weather_data
ORDER BY device_id, recorded_at;

结果

 device_id | temperature |     recorded_at      
-----------+-------------+---------------------
 device_1  |        22.5 | 2023-01-15 08:00:00 
 device_2  |        21.0 | 2023-01-15 08:05:00 
 device_3  |        24.0 | 2023-01-15 08:25:00 

此查询根据 recorded_at 时间戳返回每个 device_id 的第一个记录温度。

结论

DISTINCT 子句是 PostgreSQL 中的一个强大工具,用于从查询结果中删除重复的行。要了解有关此 PostgreSQL 子句的更多信息,请查看官方文档。如果要了解 Timescale 团队如何将 DISTINCT 查询速度提高 8,000 倍的幕后故事,请阅读我们的博客文章