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_typestate2_type 的數做參數。如果只使用了一個狀態值,最終處理函數必須以一個該狀態值的型態的數為參數。巨集的輸出數據型態被定義為此函數的返回型態。
initial_condition1
狀態值 1 的初始值。
initial_condition2
狀態值 2 的初始值。

輸出

CREATE
命令執行成功的返回資訊。

描述

CREATE AGGREGATE 允許用戶或程式員通過定義新的巨集函數來擴展 Postgres 的功能。一些用於基本型態的巨集函數如 min(int4)avg(float8) 等已經包含在軟件裡。如果你需要定義一個新型態或需要一個還沒有提供的巨集函數,這時便可用CREATE AGGREGATE 來提供我們所需要的特性。

一個巨集函數是用它的名字和輸入數據型態來標識的。如果兩個巨集的輸入數據不同,它們可以有相同的名字。要避免衝突,不要寫一個與巨集同名而且輸入函數也相同的普通函數。

一個巨集函數是由一到三個普通函數做成的:兩個狀態轉換函數,sfunc1sfunc2,和一個最終計算函數,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 (一個遞增函數)但不需要 sfunc1ffunc,而 sum 巨集需要 sfunc1 (一個累加函數)但不需要 sfunc2ffuncavg 巨集需要上面所有狀態函數和一個 ffunc (一個除法函數)來計算結果。在任何情況下,至少要定義一個狀態函數,而且任何 sfunc2 都有一個對應的 initcond2

用法

請參考 PostgreSQL 程式員手冊 巨集函數章節的巨集函數部分獲取完整的例子。
 

兼容性

SQL92

CREATE AGGREGATE 是 Postgres 語言的擴展。在 SQL92 裡沒有 CREATE AGGREGATE