CREATE AGGREGATE(7) SQL Commands CREATE AGGREGATE(7)

CREATE AGGREGATE - 定義一個新的聚集函式

CREATE AGGREGATE name (
    BASETYPE = input_data_type,
    SFUNC = sfunc,
    STYPE = state_data_type
    [ , FINALFUNC = ffunc ]
    [ , INITCOND = initial_condition ]
)

CREATE AGGREGATE 定義一個新的聚集函式。 一些用於基本型別的聚集函式如 min(integer) 和 avg(double precision) 等已經包含在基礎軟體包裡了。 如果你需要定義一個新型別或需要一個還沒有提供的聚集函式,這時便可用 CREATE AGGREGATE 來提供我們所需要的特性。

如果給出了一個模式的名字(比如,CREATE AGGREGATE myschema.myagg ...),那麼該聚集函式是在指定模式中建立的。 否則它是在當前模式中建立的。

一個聚集函式是用它的名字和輸入資料型別來標識的。 同一模式中如果兩個聚集處理的輸入資料不同,它們可以有相同的名字。 一個聚集函式的輸入資料型別必須和所有同一模式中的普通函式的名字和輸入型別不同。

一個聚集函式是用一個或兩個普通函式做成的: 一個狀態轉換函式 sfunc, 和一個可選的終計算函式 ffunc. 它們是這樣使用的:

sfunc( internal-state, next-data-item ) ---> next-internal-state
ffunc( internal-state ) ---> aggregate-value

PostgreSQL 建立一個型別為 stype的臨時變數。 它儲存這個聚集的當前內部狀態。 對於每個輸入資料條目, 都呼叫狀態轉換函式計算內部狀態值的新數值。 在處理完所有資料後,呼叫一次最終處理函式以計算聚集的返回值。 如果沒有最終處理函式,那麼將最後的狀態值當做返回值。

一個聚集函式還可能提供一個初始條件,也就是說,所用的該內部狀態值的初始值。 這個值是作為一個型別為 text 的欄位儲存在資料庫裡的, 不過它們必須是狀態值資料型別的合法的外部表現形式的常量。 如果沒有提供狀態,那麼狀態值初始化為 NULL。

如果該狀態轉換函式被定義為 "strict", 那麼就不能用 NULL 輸入呼叫它。這個時候,帶有這樣的轉換函式的聚集執行起來的現象如下所述。 NULL 輸入的值被忽略(不呼叫此函式並且保留前一個狀態值)。如果初始狀態值是 NULL,那麼由第一個非 NULL 值替換該狀態值, 而狀態轉換函式從第二個非 NULL 的輸入值開始呼叫。這樣做讓我們比較容易實現象 max 這樣的聚集。 請注意這種行為只是當 state_type 與 input_data_type 相同的時候才表現出來。 如果這些型別不同,你必須提供一個非 NULL 的初始條件或者使用一個非strice的狀態轉換函式。

如果狀態轉換函式不是 strict(嚴格)的, 那麼它將無條件地為每個輸入值呼叫, 並且必須自行處理 NULL 輸入和 NULL 轉換值, 這樣就允許聚集的作者對聚集中的空值有完全的控制。

如果終轉換函式定義為"strict",則如果最終狀態值是 NULL 時就不會呼叫它; 而是自動輸出一個NULL的結果。(當然,這才是 strict 函式的正常特徵。) 不管是那種情況,終處理函式可以選擇返回 NULL。比如, avg 的終處理函式在零輸入記錄時就會返回 NULL。

要建立的聚集函式名(可以有模式修飾的)。
本聚集函式要處理的基本資料型別。 對於不檢查輸入型別的聚集來說,這個引數可以宣告為"ANY"。 (比如 count(*))。
用於處理源資料列裡的每一個輸入資料的狀態轉換函式名稱。 它通常是一個雙引數的函式,第一個引數的型別是 state_data_type 而第二個引數的型別是 input_data_type. 另外,對於一個不檢查輸入資料的聚集,該函式只接受一個型別為 state_data_type 的引數。 不管是哪種情況,此函式必須返回一個型別為 state_data_type的值。 這個函式接受當前狀態值和當前輸入資料條目,而返回下個狀態值。
聚集的狀態值的資料型別。
在轉換完所有輸入域/欄位後呼叫的最終處理函式。它計算聚集的結果。 此函式必須接受一個型別為 state_data_type 的引數。 聚集的輸出資料型別被定義為此函式的返回型別。 如果沒有宣告 ffunc 則使用聚集結果的狀態值作為聚集的結果,而輸出型別為 state_data_type。
狀態值的初始設定(值)。它必須是一個數據型別 state_data_type 可以接受的文字常量值。 如果沒有宣告,狀態值初始為 NULL。

CREATE AGGREGATE 的引數可以以任何順序書寫,而不只是上面顯示的順序。

參閱 ``User-defined Aggregates''

CREATE AGGREGATE 是 PostgreSQL 語言的擴充套件。 在 SQL 標準裡沒有 CREATE AGGREGATE。

ALTER AGGREGATE [alter_aggregate(7)], DROP AGGREGATE [drop_aggregate(l)]

譯者

Postgresql 中文網站 何偉平 <laser@pgsqldb.org>

本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh

2003-11-02 SQL - Language Statements