立即开始增强您的 PostgreSQL。
作者:Timescale 团队
在 PostgreSQL 或 TimescaleDB 中,您可能经常需要从查询结果中消除重复的行以获得一组唯一的记录。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');
了解 Timescale 团队如何使 DISTINCT 查询在 PostgreSQL 上的速度提高了 8,000 倍。
让我们深入研究一些示例,以了解 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_id
和 humidity
的唯一组合。我们可以在多列上使用 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_id
和 humidity
的唯一组合。
示例 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 倍的幕后故事,请阅读我们的博客文章。