CREATE AGGREGATE
CREATE AGGREGATE ─ 定義一個新的巨集函數
語法
CREATE AGGREGATE name ( BASETYPE = input_data_type
[ , SFUNC1 = sfunc1, STYPE1 = state1_type ]
[ , SFUNC2 = sfunc2, STYPE2 = state2_type ]
[ , FINALFUNC = ffunc ]
[ , INITCOND1 = initial_condition1 ]
[ , INITCOND2 = initial_condition2 ] )
輸入
-
name
-
要創建的巨集函數名。
-
input_data_type
-
本巨集函數要處理的基本數據型態。
-
sfunc1
-
用於處理源數據列裡的每一個非空(non-NULL)數據的狀態轉換函數。它必須是一個兩個參數的函數,第一個參數的型態是
state1_type
而第二個參數的型態是 input_data_type。此函數必須返回一個型態為
state1_type
的值。這個函數接受當前狀態值 1 和當前輸入數據條目,而返回下個狀態值
1。
-
state1_type
-
巨集的第一個狀態值的數據型態。
-
sfunc2
-
用於處理源數據列裡的每一個非空(non-NULL)數據的狀態轉換函數。它是一個單個參數的函數,參數的型態是
state2_type,返回相同的型態。這個函數接受當前狀態值
2 和當前輸入數據條目,而返回下個狀態值 2。
-
state2_type
-
巨集的第二個狀態值的型態。
-
ffunc
-
在轉換完所有輸入域/字段後調用的最終處理函數。如果兩個狀態值都使用了,最終處理函數必須以兩個型態分別為
state1_type
和 state2_type 的數做參數。如果只使用了一個狀態值,最終處理函數必須以一個該狀態值的型態的數為參數。巨集的輸出數據型態被定義為此函數的返回型態。
-
initial_condition1
-
狀態值 1 的初始值。
-
initial_condition2
-
狀態值 2 的初始值。
命令執行成功的返回資訊。
描述
CREATE AGGREGATE 允許用戶或程式員通過定義新的巨集函數來擴展
Postgres
的功能。一些用於基本型態的巨集函數如
min(int4) 和
avg(float8)
等已經包含在軟件裡。如果你需要定義一個新型態或需要一個還沒有提供的巨集函數,這時便可用
CREATE
AGGREGATE 來提供我們所需要的特性。
一個巨集函數是用它的名字和輸入數據型態來標識的。如果兩個巨集的輸入數據不同,它們可以有相同的名字。要避免衝突,不要寫一個與巨集同名而且輸入函數也相同的普通函數。
一個巨集函數是由一到三個普通函數做成的:兩個狀態轉換函數,sfunc1
和 sfunc2,和一個最終計算函數,ffunc。它們是這樣使用的:
sfunc1( internal-state1, next-data-item ) ---> next-internal-state1
sfunc2( internal-state2 ) ---> next-internal-state2
ffunc(internal-state1, internal-state2) ---> aggregate-value
Postgres 創建一個或兩個臨時變數(數據型態是
stype1 和/或
stype2)用於保存被轉換函數作為參數的中間結果。對於每個輸入數據條目,都調用狀態轉換函數計算內部狀態值的新數值。在處理完所有數據後,調用一次最終處理函數以計算巨集的輸出值。
如果兩個轉換函數都聲明了,那麼必須聲明 ffunc。如果只聲明了一個轉換函數,那麼ffunc
是可選的。在沒有提供 ffunc 時的預設動作是返回所使用的內部狀態值的最後的值(因此,巨集的輸出型態於狀態值的型態相同)。
一個巨集函數還可能提供一到兩個初始條件,也就是說,所用的該內部狀態值的初始值。這些值是做為型態 text
的數據域儲存在資料庫裡的,不過它們必須是狀態值數據型態的有效外部表現形式的常數。如果聲明了
sfunc1 而沒有聲明 initcond1 值,那麼系統不會對第一個輸入條目調用l
sfunc1﹔取而代之的是,用第一個輸入條目初始化內部狀態值
1,而從第二個輸入條目的開始調用 sfunc1。這樣對於像 MIN
和 MAX 這樣的函數是很有用的。請注意一個使用這個特性的巨集在沒有輸入值時將返回
NULL。對狀態值 2 沒有類似的準備﹔如果聲明了
sfunc2,那麼需要一個
initcond2。
注意
使用
DROP AGGREGATE 刪除巨集函數。
CREATE AGGREGATE 的參數可以以任何順序書寫,而不只是上面顯示的順序。
聲明的巨集函數有可能有各種各樣不同的狀態和終處理函數組成。比如,count
巨集需要 Ssfunc2 (一個遞增函數)但不需要 sfunc1
或 ffunc,而 sum 巨集需要 sfunc1
(一個累加函數)但不需要 sfunc2 或 ffunc
而 avg 巨集需要上面所有狀態函數和一個 ffunc (一個除法函數)來計算結果。在任何情況下,至少要定義一個狀態函數,而且任何
sfunc2 都有一個對應的 initcond2。
用法
請參考
PostgreSQL 程式員手冊 巨集函數章節的巨集函數部分獲取完整的例子。
兼容性
SQL92
CREATE AGGREGATE 是
Postgres
語言的擴展。在 SQL92 裡沒有
CREATE AGGREGATE 。