繁体   English   中英

PostgreSQL中聚合和函数的区别

[英]Difference between aggregate and function in PostgreSQL

PostgreSQL 中的聚合和函数有什么区别?

聚合只是一个专门的功能吗? (聚合约束:参数必须是多集,返回值必须是单值)

我可以在可以聚合的任何地方使用函数吗?

使用 PostgreSQL 函数或聚合时有什么特殊之处吗?

聚合是函数的子集。

每个聚合也是一个函数(输入参数类型为array/set of values输出类型为single scalar value

您可以将每个聚合替换为任何其他聚合 - 并获得不同的结果 - 但如果将其替换为不聚合输入值的函数,则可能会出现错误。

特殊性来自定义 - 聚合获取一个列表,对其值执行一些计算并产生单个结果(这显然不是一个列表)。 其他功能可能不适用于列表输入 - 例如 LOWER、UPPER、SQRT 等。

差异取决于视角。 内部聚合函数作为“累积”函数(读取值并更新状态累积值)和“最终”函数(将累积值转换为最终结果)的重复调用执行。 从用户的角度来看,聚合函数也是函数,但用途和用途不同。 聚合函数和标量函数是不可替换的。 你不能在应该使用聚合函数的地方使用标量函数,你不能在应该使用标量函数的地方使用聚合函数。 聚合函数跨行计算,标量函数仅计算每一行。 聚合函数和标量函数的语法相同,但其他一切都显着不同。

是的,聚合函数是专门的。 考虑几乎所有 SQL 文档,并且在大多数(希望是全部)中,您会找到对列出许多类型函数的函数的引用。 其中一种类型是“聚合函数”。 从示例列表中:

Chapter 9. Functions and Operators
Table of Contents

9.1. Logical Operators
9.2. Comparison Functions and Operators
9.3. Mathematical Functions and Operators
9.4. String Functions and Operators
9.5. Binary String Functions and Operators
9.6. Bit String Functions and Operators
9.7. Pattern Matching
9.8. Data Type Formatting Functions
9.9. Date/Time Functions and Operators
...
9.21. Aggregate Functions

(从 PostgreSQL 14 中提取)。 请参阅函数聚合函数(当前版本链接)

您可以将一个聚合函数替换为另一个聚合函数,例如,您可以将MIN(column1)MAX(column1)交换而不会导致语法错误 - 但显然结果可能非常不同。 但是,不可能只用任何函数代替聚合。

我可以在任何可能聚合的地方使用函数吗?

从某种意义上说,您不能“交换”任何函数(如已经讨论过的),但您可以group by中包含非聚合函数,例如:

select date_trunc('month', datecolumn), sum(quantity)
from table1
group by date_trunc('month', datecolumn)

使用 PostgreSQL 函数或聚合时有什么特殊之处吗?

是和否。完全符合 SQL 标准的函数(例如 MIN/MAX/SUM/COUNT)就是“符合标准”。 然而,确实存在其他 dbms 中可能不存在的更多奇异函数,例如jsonb_object_agg() 使用文档来探索许多可用的功能。

一个非常有用的专用 Postgres 函数(它返回一个“集合”)是 generate_series() 例如

generate_series ( start timestamp, stop timestamp, step interval )

见: 9.25。 设置返回函数

注意:函数也可以是“用户定义的”(即由用户构建)。 因此,您可以使用的功能的完整列表也可能包括其中的一些 - 这些将是“高度专业化的”,因为它们可能是您的组织所独有的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM