postgres 聚合函数中的 DISTINCT ON

作者:编程家 分类: postgresql 时间:2025-06-11

PostgreSQL 中的 DISTINCT ON 聚合函数

PostgreSQL 是一种功能强大且广泛使用的开源关系型数据库管理系统。它提供了许多强大的聚合函数,其中之一是 DISTINCT ON,它可以在查询结果中返回基于特定列的唯一值。本文将介绍 DISTINCT ON 的用途、语法和使用案例。

用途

DISTINCT ON 聚合函数用于从查询结果中返回基于指定列的唯一值。它对于需要获取每个组中的唯一记录非常有用。通常情况下,使用 DISTINCT ON 可以简化复杂的查询,并提高查询性能。

语法

DISTINCT ON 聚合函数的语法如下所示:

SELECT DISTINCT ON (column_name)

column_name, other_column(s)

FROM table_name

ORDER BY column_name, other_column(s)

在这个语法中,column_name 是要基于其获取唯一值的列名。如果有多个列,可以在 ORDER BY 子句中指定它们的顺序。在查询结果中,只有第一个出现的唯一值会被返回。

案例

假设我们有一个名为 "employees" 的表,其中包含员工的姓名、部门和工资信息。我们想要获取每个部门中工资最高的员工的记录。使用 DISTINCT ON,我们可以轻松实现这一目标。

首先,我们需要创建一个名为 "employees" 的表,并插入一些示例数据:

sql

CREATE TABLE employees (

id serial primary key,

name varchar(100),

department varchar(100),

salary numeric(10,2)

);

INSERT INTO employees (name, department, salary)

VALUES ('John Doe', 'Sales', 5000.00),

('Jane Smith', 'Sales', 5500.00),

('Mike Johnson', 'Marketing', 6000.00),

('Amy Williams', 'Marketing', 6500.00),

('Tom Davis', 'IT', 7000.00),

('Emily Brown', 'IT', 7500.00);

现在,我们可以使用 DISTINCT ON 来获取每个部门中工资最高的员工的记录:

sql

SELECT DISTINCT ON (department) department, name, salary

FROM employees

ORDER BY department, salary DESC;

这个查询将返回每个部门中工资最高的员工的记录,按照部门名称进行分组,并按照工资降序排序。

在本文中,我们介绍了 PostgreSQL 中的 DISTINCT ON 聚合函数的用途、语法和使用案例。DISTINCT ON 可以帮助我们从查询结果中获取基于指定列的唯一值,特别适用于需要获取每个组中的唯一记录的情况。通过使用 DISTINCT ON,我们可以轻松地完成复杂的查询,并提高查询性能。