pgsql distinct on

在 PostgreSQL 中,DISTINCT ON 是一种用于过滤结果集合的特殊语法。它允许你根据指定的列选择唯一的行,并且只保留每组中的第一行。这个功能对于需要按照特定列去除重复数据并且保留每组中的第一个值的场景非常有用。在本文中,我们将详细介绍 DISTINCT ON 的用法和示例。
语法和用法
DISTINCT ON 语法如下:
SELECT DISTINCT ON (expression) column1, column2, ...
FROM table_name
WHERE condition
ORDER BY expression, column1, column2, ...
DISTINCT ON后面跟着括号内的表达式,这个表达式可以是一个列名、函数、或者一个表达式。column1, column2, ...是你想要选择的列。table_name是你想要从中选择数据的表格。condition是 过滤条件,可选。ORDER BY子句用于指定如何排序结果,expression用于确定哪个行是每个组的第一行。
示例
让我们通过一个示例来演示 DISTINCT ON 的用法。假设我们有一个 students 表包含了学生的成绩,并且我们想要找到每个班级中成绩最高的学生。我们可以使用 DISTINCT ON 来实现这个需求。
首先,让我们创建一个 students 表并插入一些数据:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(50),
class VARCHAR(10),
score INTEGER
);
INSERT INTO students (name, class, score) VALUES ('Alice', 'A', 90);
INSERT INTO students (name, class, score) VALUES ('Bob', 'A', 85);
INSERT INTO students (name, class, score) VALUES ('Charlie', 'A', 95);
INSERT INTO students (name, class, score) VALUES ('David', 'B', 88);
INSERT INTO students (name, class, score) VALUES ('Eve', 'B', 92);
INSERT INTO students (name, class, score) VALUES ('Frank', 'B', 85);
现在我们可以使用 DISTINCT ON 来找到每个班级中成绩最高的学生:
SELECT DISTINCT ON (class) *
FROM students
ORDER BY class, score DESC;
-- 输出结果
/*
id | name | class | score
----+---------+-------+-------
3 | Charlie | A | 95
5 | Eve | B | 92
*/
在上面的查询中,我们选择了每个班级中的第一个学生,也就是成绩最高的学生。ORDER BY 子句按照 class 和 score 两列进行降序排序,DISTINCT ON 选择了每个班级中的第一个行。
注意事项
在使用 DISTINCT ON 时,需要注意以下几点:
DISTINCT ON只保留每个组的第一个行,所以在ORDER BY子句中要确保按照你的需求正确排序。DISTINCT ON通常与ORDER BY结合使用,但是在某些情况下可以省略ORDER BY。DISTINCT ON不是 SQL 标准的一部分,所以它在不同数据库系统中可能有一些差异。
总结
在本文中,我们介绍了 PostgreSQL 中 DISTINCT ON 的用法和示例。通过使用 DISTINCT ON,我们可以很方便地选择每个组中的第一个行,从而得到我们想要的结果。
极客教程