PostgreSQL CREATE AGGREGATE

2021-09-09 10:05 更新

CREATE AGGREGATE — 定義一個新的聚集函數(shù)

大綱

CREATE [ OR REPLACE ] AGGREGATE name ( [ argmode ] [ argname ] arg_data_type [ , ... ] ) (
    SFUNC = sfunc,
    STYPE = state_data_type
    [ , SSPACE = state_data_size ]
    [ , FINALFUNC = ffunc ]
    [ , FINALFUNC_EXTRA ]
    [ , FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
    [ , COMBINEFUNC = combinefunc ]
    [ , SERIALFUNC = serialfunc ]
    [ , DESERIALFUNC = deserialfunc ]
    [ , INITCOND = initial_condition ]
    [ , MSFUNC = msfunc ]
    [ , MINVFUNC = minvfunc ]
    [ , MSTYPE = mstate_data_type ]
    [ , MSSPACE = mstate_data_size ]
    [ , MFINALFUNC = mffunc ]
    [ , MFINALFUNC_EXTRA ]
    [ , MINITCOND = minitial_condition ]
    [ , SORTOP = sort_operator ]
    [ , PARALLEL = { SAFE | RESTRICTED | UNSAFE } ]
)

CREATE [ OR REPLACE ] AGGREGATE name ( [ [ argmode ] [ argname ] arg_data_type [ , ... ] ]
                        ORDER BY [ argmode ] [ argname ] arg_data_type [ , ... ] ) (
    SFUNC = sfunc,
    STYPE = state_data_type
    [ , SSPACE = state_data_size ]
    [ , FINALFUNC = ffunc ]
    [ , FINALFUNC_EXTRA ]
    [ , FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
    [ , INITCOND = initial_condition ]
    [ , HYPOTHETICAL ]
    [ , PARALLEL = { SAFE | RESTRICTED | UNSAFE } ]
)

或者舊的語法

CREATE [ OR REPLACE ] AGGREGATE name (
    BASETYPE = base_type,
    SFUNC = sfunc,
    STYPE = state_data_type
    [ , SSPACE = state_data_size ]
    [ , FINALFUNC = ffunc ]
    [ , FINALFUNC_EXTRA ]
    [ , FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
    [ , COMBINEFUNC = combinefunc ]
    [ , SERIALFUNC = serialfunc ]
    [ , DESERIALFUNC = deserialfunc ]
    [ , INITCOND = initial_condition ]
    [ , MSFUNC = msfunc ]
    [ , MINVFUNC = minvfunc ]
    [ , MSTYPE = mstate_data_type ]
    [ , MSSPACE = mstate_data_size ]
    [ , MFINALFUNC = mffunc ]
    [ , MFINALFUNC_EXTRA ]
    [ , MFINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
    [ , MINITCOND = minitial_condition ]
    [ , SORTOP = sort_operator ]
)

描述

CREATE AGGREGATE定義一個新的聚集函數(shù)。CREATE OR REPLACE AGGREGATE將定義新的聚合函數(shù)或替換現(xiàn)有定義。 在發(fā)布中已經(jīng)包括了一些基本的和常用的聚集函數(shù);它們的文檔請見第 9.21 節(jié)。 如果要定義一個新類型或者需要一個還沒有被提供的聚集函數(shù),那么CREATE AGGREGATE就可以被用來提供想要的特性。

在替換現(xiàn)有定義時(shí),參數(shù)類型、結(jié)果類型和直接參數(shù)的數(shù)量可能不會更改。 此外,新定義的類型(普通聚合、有序集聚合或假設(shè)集聚合)必須與舊定義相同。

如果給定了一個模式名(例如CREATE AGGREGATE myschema.myagg ...),那么該聚集會被創(chuàng)建在指定的模式中。否則它 會被創(chuàng)建在當(dāng)前模式中。

一個聚集函數(shù)需要用它的名稱和輸入數(shù)據(jù)類型標(biāo)識。同一個模式中的兩個聚集 可以具有相同的名稱,只要它們在不同的輸入類型上操作即可。一個聚集的名稱 和輸入數(shù)據(jù)類型必須與同一模式中的每一個普通函數(shù)區(qū)分開。這種行為與普通函 數(shù)名的重載完全一樣(見CREATE FUNCTION)。

一個簡單的聚集函數(shù)由一個或者多個普通函數(shù)組成: 一個狀態(tài)轉(zhuǎn)移函數(shù) sfunc和一個可選的最終 計(jì)算函數(shù) ffunc。 它們被這樣使用:

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

PostgreSQL創(chuàng)建一個數(shù)據(jù)類型 stype的臨時(shí)變量來 保持聚集的當(dāng)前內(nèi)部狀態(tài)。對每一個輸入行,聚集參數(shù)值會被計(jì)算并且狀態(tài) 轉(zhuǎn)移函數(shù)會被調(diào)用,它用當(dāng)前狀態(tài)值和新參數(shù)值計(jì)算一個新的內(nèi)部狀態(tài)值。 等所有行都被處理完后,最終函數(shù)會被調(diào)用一次來計(jì)算該聚集的返回值。如果 沒有最終函數(shù),則最終的狀態(tài)值會被返回。

一個聚集函數(shù)可以提供一個初始條件,即一個用于內(nèi)部狀態(tài)值的初始值。它被 作為一個類型text的值指定并且存儲在數(shù)據(jù)庫中,但是它必須 是狀態(tài)值數(shù)據(jù)類型的一個常量的合法外部表示。如果沒有提供,則狀態(tài)值從空值 開始。

如果狀態(tài)轉(zhuǎn)移函數(shù)被聲明為strict,那么不能用空值輸入來 調(diào)用它。如果有這種轉(zhuǎn)移函數(shù),聚集將按照下面的行為執(zhí)行。帶有任何空值的 行會被忽略(函數(shù)不被調(diào)用并且之前的狀態(tài)值被保持)。如果初始狀態(tài)值就是 空值,那么碰到第一個沒有空值的行時(shí),狀態(tài)值會被替換成第一個參數(shù)值,并且 對于每一個后續(xù)的沒有空值的行都會調(diào)用該轉(zhuǎn)移函數(shù)。這對實(shí)現(xiàn) max這樣的聚集很方便。注意只有當(dāng) state_data_type 和第一個 arg_data_type相同時(shí), 這種行為才可用。當(dāng)這些類型不同時(shí),你必須提供一個非空初始條件或者使用 一個非嚴(yán)格轉(zhuǎn)移函數(shù)。

如果狀態(tài)轉(zhuǎn)移函數(shù)不是嚴(yán)格的,那么在碰到每個輸入行時(shí)都將會調(diào)用它,并且 它必須自行處理空值輸入和空狀態(tài)值。這允許聚集的作者完全控制該聚集如何 處理空值。

如果最終函數(shù)被聲明為strict,那么當(dāng)最終狀態(tài)值為空時(shí)將 不會調(diào)用它,而是自動地返回一個空結(jié)果(當(dāng)然,這只是嚴(yán)格函數(shù)的普通行為)。 在任何情況下最終函數(shù)都可以返回一個空值。例如,avg的最終函數(shù)會在看到零個 輸入行時(shí)返回空。

有時(shí)候把最終函數(shù)聲明成不僅采用狀態(tài)值還采用對應(yīng)于聚集輸入值的額外參數(shù) 是有用的。這樣做的主要原因是,如果最終函數(shù)是多態(tài)的,那么狀態(tài)值的數(shù)據(jù) 類型將不適合于用來確定結(jié)果類型。這些額外的參數(shù)總是以 NULL 形式傳遞 (因此使用FINALFUNC_EXTRA選項(xiàng)時(shí),最終函數(shù)不能是嚴(yán)格的), 但盡管如此它們都是合法參數(shù)。例如,最終函數(shù)可以利用 get_fn_expr_argtype來標(biāo)識當(dāng)前調(diào)用中的實(shí)際參數(shù)類型。

第 37.12.1 節(jié)中所述,一個聚集可以 選擇支持moving-aggregate mode。這要求指定 MSFUNC、MINVFUNC以及 MSTYPE參數(shù),并且參數(shù)MSSPACE、 MFINALFUNC、MFINALFUNC_EXTRAMINITCOND是可選的。除了MINVFUNC, 這些參數(shù)的工作都和對應(yīng)的不帶M的簡單聚集參數(shù)相似,它們 定義了包括一個逆向轉(zhuǎn)移函數(shù)的聚集的一種獨(dú)立實(shí)現(xiàn)。

在參數(shù)列表中帶有ORDER BY的語法會創(chuàng)建一種被稱為 有序集聚集的特殊聚集類型。如果指定了 HYPOTHETICAL,則會創(chuàng)建一個 假想集聚集。這些聚集以依賴排序的方法在排好序 的值上操作,因此指定一個輸入排序順序是調(diào)用過程的重要一環(huán)。還有,它們 可以有直接參數(shù),這類參數(shù)只對每次聚集計(jì)算一次,而不是對 每一個輸入行計(jì)算一次。假想集聚集是有序集聚集的一個子類,其中一些直接 參數(shù)要求在數(shù)量和類型上都匹配被聚集的參數(shù)列。這允許這些直接參數(shù)的值被 當(dāng)做一個附加的假想行被加入到聚集輸入行的集合中。

第 37.12.4 節(jié)中所示,一個聚集可以支持 部分聚集。這要求指定COMBINEFUNC參數(shù)。 如果state_data_typeinternal,通常也可以提供SERIALFUNCDESERIALFUNC參數(shù),這樣可以讓并行聚集成為可能。注意, 該聚集還必須被標(biāo)記為PARALLEL SAFE以啟用并行聚集。

行為與MINMAX相似的聚集有時(shí)可以通過 直接查看一個索引而不是掃描每一個輸入行來優(yōu)化。如果這個聚集可以被這樣 優(yōu)化,請通過指定一個排序操作符來指出?;疽笫牵?聚集必須得出由該操作符產(chǎn)生的排序順序中的第一個元素,換句話說:

SELECT agg(col) FROM tab;

必須等價(jià)于:

SELECT col FROM tab ORDER BY col USING sortop LIMIT 1;

進(jìn)一步的假定是該聚集忽略空輸入,并且當(dāng)且僅當(dāng)沒有非空輸入時(shí)它才會返回 一個空結(jié)果。通常,一種數(shù)據(jù)類型的<操作符是 MIN的合適的排序操作符,而>MAX的合適的排序操作符。注意,除非指定的操作符是一個 B-樹索引操作符類的小于或者 大于策略成員,優(yōu)化將永遠(yuǎn)不會產(chǎn)生實(shí)際效果。

要能夠創(chuàng)建一個聚集函數(shù),你必須具有參數(shù)類型、狀態(tài)類型和返回類型上的 USAGE特權(quán),還有在支持函數(shù)上的 EXECUTE特權(quán)。

參數(shù)

name

要創(chuàng)建的聚集函數(shù)的名稱(可以是模式限定的)。

argmode

一個參數(shù)的模式:IN或者VARIADIC(聚集函數(shù) 不支持OUT參數(shù))。如果忽略,默認(rèn)值是IN。 只有最后一個參數(shù)能被標(biāo)記為VARIADIC。

argname

一個參數(shù)的名稱。當(dāng)前這只用于文檔的目的。如果被忽略,該參數(shù)就沒有名稱。

arg_data_type

這個聚集函數(shù)操作的一個輸入數(shù)據(jù)類型。要創(chuàng)建一個零參數(shù)的聚集函數(shù),可以 寫一個*來替代參數(shù)說明的列表(這類聚集的一個例子是 count(*))。

base_type

CREATE AGGREGATE的舊語法中,輸入數(shù)據(jù)類型是由 一個basetype參數(shù)指定而不是寫在聚集名之后。注意這種語法 只允許一個輸入?yún)?shù)。要用這種語法定義一個零參數(shù)的聚集函數(shù),把 basetype指定為"ANY"(不是*)。 有序集聚集不能用舊語法定義。

sfunc

要為每一個輸入行調(diào)用的狀態(tài)轉(zhuǎn)移函數(shù)名。對于一個正常的 N-參數(shù)的聚集函數(shù), sfunc必須接收 N+1 個參數(shù), 第一個參數(shù)的類型是state_data_type而其余的參數(shù)匹配 該聚集被聲明的輸入數(shù)據(jù)類型。該函數(shù)必須返回一個類型為 state_data_type 的值。這個函數(shù)會采用當(dāng)前的狀態(tài)值以及當(dāng)前的輸入數(shù)據(jù)值,并且返回下一個 狀態(tài)值。

對于有序集(包括假想集)聚集,狀態(tài)轉(zhuǎn)移函數(shù)只接收當(dāng)前的狀態(tài)值和聚集參數(shù), 但無需直接參數(shù)。否則它就和其他轉(zhuǎn)移函數(shù)一樣了。

state_data_type

聚集的狀態(tài)值的數(shù)據(jù)類型。

state_data_size

聚集的狀態(tài)值的近似平均尺寸(以字節(jié)計(jì))。如果這個參數(shù)被忽略或者為零, 將使用一個基于state_data_type的默認(rèn)估計(jì)值。規(guī)劃器 使用這個值來估計(jì)一個分組聚集查詢所需的內(nèi)存。

ffunc

最終函數(shù)的名稱,該函數(shù)在所有輸入行都被遍歷之后被調(diào)用來計(jì)算聚集的結(jié)果。 對于一個常規(guī)聚集,這個函數(shù)必須只接受一個類型為state_data_type的單一參數(shù)。該聚集 的返回?cái)?shù)據(jù)類型被定義為這個函數(shù)的返回類型。如果沒有指定 ffunc,則結(jié)束狀態(tài)值 被用作聚集的結(jié)果,并且返回類型為state_data_type。

對于有序集(包括假想集)聚集,最終函數(shù)不僅接收最終狀態(tài)值,還會接收所 有直接參數(shù)的值。

如果指定了FINALFUNC_EXTRA,則除了最終狀態(tài)值和任何直接 參數(shù)之外,最終函數(shù)還接收額外的對應(yīng)于該聚集的常規(guī)(聚集)參數(shù)的 NULL 值。 這主要用于在定義了一個多態(tài)聚集時(shí)允許正確地決定聚集的結(jié)果類型。

FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE }

此選項(xiàng)指定最終函數(shù)是否為不會修改參數(shù)的純函數(shù)。READ_ONLY表示它不會修改;其他兩個值表示它可能會更改遷移狀態(tài)值。請參見本文中的注意事項(xiàng)以獲取更多詳細(xì)信息。除了有序集合的聚合使用默認(rèn)值READ_WRITE,其他默認(rèn)值均為 READ_ONLY。

combinefunc

combinefunc函數(shù)可以被 有選擇地指定以允許聚集函數(shù)支持部分聚集。如果提供這個函數(shù), combinefunc必須組合兩個 state_data_type值,每一個 都包含在輸入值某個子集上的聚集結(jié)果,它會產(chǎn)生一個新的 state_data_type來表示在 兩個輸入集上的聚集結(jié)果。這個函數(shù)可以被看做是一個 sfunc,和后者在一個個體 輸入行上操作并且把它加到運(yùn)行聚集狀態(tài)上不同,這個函數(shù)是把另一個聚集狀態(tài)加 到運(yùn)行狀態(tài)上。

combinefunc必須被聲明為 有兩個state_data_type參數(shù) 并且返回一個state_data_type 值。這個函數(shù)可以有選擇性地被標(biāo)記為strict。在被標(biāo)記的情況下, 當(dāng)任何一個輸入狀態(tài)為空時(shí),將不會調(diào)用該函數(shù),而是把另一個狀態(tài)當(dāng)作正確的結(jié)果。

對于state_data_typeinternal的聚集函數(shù), combinefunc不能為 strict。這種情況下, combinefunc必須確保 正確地處理空狀態(tài)并且被返回的狀態(tài)能被恰當(dāng)?shù)卮鎯υ诰奂瘍?nèi)存上下文中。

serialfunc

state_data_typeinternal的一個聚集函數(shù)可以參與到并行聚集中,當(dāng)且僅當(dāng)它具有一個 serialfunc函數(shù),該函數(shù) 必須把聚集狀態(tài)序列化成一個bytea值以傳送給另一個進(jìn)程。這個函數(shù) 必須有一個單一的 internal類型參數(shù)并且返回類型bytea。 相應(yīng)地也需要一個deserialfunc

deserialfunc

把一個之前序列化后的聚集狀態(tài)反序列化為 state_data_type。這個函數(shù) 必須有兩個類型分別為byteainternal的參數(shù),并且產(chǎn)生 一個類型internal的結(jié)果(注意:第二個類型為internal的 參數(shù)是無用的,但是為了類型安全的原因還是要求有該參數(shù))。

initial_condition

狀態(tài)值的初始設(shè)置。這必須是以數(shù)據(jù)類型state_data_type能夠接受的形式出現(xiàn) 的一個字符串常量。如果沒有指定,狀態(tài)值會從空值開始。

msfunc

前向狀態(tài)轉(zhuǎn)移函數(shù)的名稱,在移動聚集模式中會為每個輸入行調(diào)用這個函數(shù)。它 非常像常規(guī)的轉(zhuǎn)移函數(shù),不過它的第一個參數(shù)和結(jié)果類型是 mstate_data_type,這可能與 state_data_type不同。

minvfunc

在移動聚集模式中用到的逆向狀態(tài)轉(zhuǎn)移函數(shù)的名稱。這個函數(shù)與 msfunc具有相同的參數(shù)和結(jié)果類型,但是它被用于從當(dāng)前聚集 狀態(tài)中移除一個值,而不是向其中增加一個值。逆向轉(zhuǎn)移函數(shù)必須具有和前向狀態(tài) 轉(zhuǎn)移函數(shù)相同的嚴(yán)格性屬性。

mstate_data_type

使用移動聚集模式時(shí),用于聚集狀態(tài)值的數(shù)據(jù)類型。

mstate_data_size

使用移動聚集模式時(shí),聚集狀態(tài)值的近似平均尺寸(以字節(jié)計(jì))。它的作用和 state_data_size相同。

mffunc

使用移動聚集模式時(shí)用到的最終函數(shù)名稱,當(dāng)所有輸入行都被遍歷后會調(diào)用它來 計(jì)算聚集的結(jié)果。它的工作和ffunc一樣,但是它的第一個參 數(shù)類型是mstate_data_type并且額外的空參數(shù)要通過書寫 MFINALFUNC_EXTRA來指定。mffunc 或者 mstate_data_type 決定的聚集結(jié)果類型必須匹配由聚集 的常規(guī)實(shí)現(xiàn)所確定的類型。

MFINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE }

此選項(xiàng)類似于FINALFUNC_MODIFY,只是它描述了移動聚集最終函數(shù)的行為。

minitial_condition

使用移動聚集模式時(shí),狀態(tài)值的初始設(shè)置。它的作用和 initial_condition一樣。

sort_operator

一個MIN- 類或者MAX-類聚集的相關(guān) 排序操作符。這只是一個操作符名稱(可能被模式限定)。這個操作符被 假定為具有和該聚集(必須是一個單一參數(shù)的常規(guī)聚集)相同的輸入數(shù)據(jù) 類型。

PARALLEL = { SAFE | RESTRICTED | UNSAFE }

PARALLEL SAFE、PARALLEL RESTRICTEDPARALLEL UNSAFE的含義和 CREATE FUNCTION中的相同。如果一個聚集被標(biāo)記為 PARALLEL UNSAFE(默認(rèn))或者 PARALLEL RESTRICTED,將不會考慮將它并行化。注意 規(guī)劃器不會參考聚集的支持函數(shù)的并行安全性標(biāo)記,它只會考慮聚集本身 的這類標(biāo)記。

HYPOTHETICAL

只用于有序集聚集,這個標(biāo)志指定聚集參數(shù)會被根據(jù)假想集聚集的要求進(jìn)行處理: 即后面的直接參數(shù)必須匹配聚集(WITHIN GROUP)參數(shù)的數(shù)據(jù) 類型。HYPOTHETICAL標(biāo)志在運(yùn)行時(shí)沒有任何效果,它只在 命令解析期間對確定數(shù)據(jù)類型和聚集參數(shù)的排序規(guī)則有用。

CREATE AGGREGATE的參數(shù)可以用任意順序書寫, 而無需遵照以上說明的順序。

注解

在指定支持函數(shù)名的參數(shù)中,如果需要你可以寫一個模式名,例如 SFUNC = public.sum。在這里不能寫參數(shù)類型 — 支持函數(shù) 的參數(shù)類型是根據(jù)其他參數(shù)決定的。

通常,PostgreSQL函數(shù)是不要修改輸入值的真函數(shù)。然而,一個聚合遷移函數(shù)在聚合上下文中使用時(shí)被允許詐欺并修改已在遷移狀態(tài)的參數(shù)。因?yàn)榕c每次創(chuàng)建一個遷移狀態(tài)的新的拷貝相比,這樣可以提供實(shí)質(zhì)的性能提升。     

同樣,雖然人們一般不期望聚合最終函數(shù)修改它的輸入值,但有時(shí)回避修改遷移態(tài)參數(shù)是不切實(shí)際的。這種行為必須使用FINALFUNC_MODIFY參數(shù)聲明。READ_WRITE值表示最終函數(shù)以某種未指定的方式修改了遷移狀態(tài)值。這個值防止將聚合用作窗口函數(shù),并且還可以防止因共用相同的輸入值和遷移函數(shù)的聚合調(diào)用而合并遷移狀態(tài)。SHAREABLE值表示過渡函數(shù)不能在最終功能之后使用用,但多重最終函數(shù)調(diào)用可以對最終的遷移狀態(tài)值執(zhí)行調(diào)用。這個值阻止將聚合用作窗口函數(shù),但允許合并過渡狀態(tài)。(也就是說,此處所關(guān)注的優(yōu)化不是重復(fù)地使用相同的最終函數(shù),而是把不同的最終函數(shù)應(yīng)用到相同的最終遷移狀態(tài)值。只要所有最終功能都沒有標(biāo)記為 READ_WRITE就被允許。)

如果一個聚集支持移動聚集模式,當(dāng)該聚集被用于一個具有移動幀起點(diǎn)(即幀起點(diǎn) 模式不是UNBOUNDED PRECEDING)的窗口函數(shù)時(shí),它將提升計(jì) 算效率。在概念上,當(dāng)從底部進(jìn)入窗口幀時(shí)前向轉(zhuǎn)移函數(shù)會把輸入值加到聚集的狀 態(tài)上,而逆向轉(zhuǎn)移函數(shù)會在從頂部離開幀時(shí)再次移除輸入值。因此,當(dāng)值被移除時(shí), 它們總是按照被加入的相同順序被移除。無論何時(shí)調(diào)用逆向轉(zhuǎn)移函數(shù),它都將因此 接收最近增加但是還未被移除的參數(shù)值。逆向轉(zhuǎn)移函數(shù)可以假定在它移除最舊的行 之后至少有一行保留在當(dāng)前狀態(tài)中(當(dāng)情況不是這樣時(shí),窗口函數(shù)機(jī)制會簡單地開 始一次新的聚集,而不是使用逆向轉(zhuǎn)移函數(shù))。

用于移動聚集模式的前向轉(zhuǎn)移函數(shù)不允許返回 NULL 作為新的狀態(tài)值。如果逆向 轉(zhuǎn)移函數(shù)返回 NULL,這表明逆向函數(shù)無法為這個特定的輸入逆轉(zhuǎn)狀態(tài)計(jì)算,并且 該聚集計(jì)算因此必須從當(dāng)前幀的開始位置“從零開始”重新被計(jì)算。在一些少見的情 況中,逆轉(zhuǎn)正在計(jì)算中的狀態(tài)值是不切實(shí)際的,這種習(xí)慣可以允許在此類情形中使用 移動聚集模式。

如果沒有提供移動聚集實(shí)現(xiàn),聚集仍然可以被用于移動幀,但是 只要幀起點(diǎn)移動,PostgreSQL都將會重新計(jì)算 整個聚集。注意不管聚集有沒有支持移動聚集模式, PostgreSQL都能處理一個移動幀結(jié)束而無需重 新計(jì)算,這可以通過增加新值到聚集狀態(tài)完成。這就是為什么使用聚合作為窗口函數(shù)需要最終函數(shù)只讀的原因。人們認(rèn)為最終函數(shù)不能破壞聚集的狀 態(tài)值,這樣即使已經(jīng)為一組幀邊界得到了一個聚集結(jié)果值,該聚集也能繼續(xù)下去。

有序集聚集的語法允許為最后一個直接參數(shù)以及最后一個聚集( WITHIN GROUP)參數(shù)指定VARIADIC。但是,當(dāng)前的 實(shí)現(xiàn)限制只能以兩種方式使用VARIADIC。第一種,有續(xù)集聚集只能 使用VARIADIC "any",不能使用其他可變數(shù)組類型。第二種,如果最 后一個直接參數(shù)是 VARIADIC "any",那么只能有一個聚集參數(shù)并且它 也必須是VARIADIC "any"(在系統(tǒng)目錄中使用的表示中,這兩個參數(shù) 會被合并為一個單一的VARIADIC "any"項(xiàng),因?yàn)?pg_proc無法表示具有超過一個VARIADIC參數(shù)的 函數(shù))。如果該聚集是一個假想集聚集,匹配VARIADIC "any"參數(shù)的 直接參數(shù)就是假想?yún)?shù)。任何在前面的參數(shù)表示額外的直接參數(shù),它們不被約束為需 要匹配聚集參數(shù)。

當(dāng)前,有序集聚集無須支持移動聚集模式,因?yàn)樗鼈儾荒鼙挥米鞔翱诤瘮?shù)。

部分(包括并行)聚集當(dāng)前不被有續(xù)集聚集支持。還有,包括 DISTINCT或者ORDER BY子句的聚集調(diào)用將不會使用 部分聚集,因?yàn)樵诓糠志奂瘯r(shí)無法支持那些語義。

兼容性

CREATE AGGREGATE是一種 PostgreSQL的語言擴(kuò)展。SQL 標(biāo)準(zhǔn)沒有提供 用戶定義的聚集函數(shù)。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號