簡體   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