CREATE AGGREGATE — 새 집계 함수 정의하기
CREATE AGGREGATE — 새 집계 함수 정의하기
CREATE AGGREGATE 명령은 새 집계 함수(aggregate function)를 정의하는 명령이에요. 상태 전이 함수(state transition function)와 선택적 최종 계산 함수로 구성돼요. 사용자 정의 집계를 만들거나 기존 정의를 교체할 수 있어요.
출처: PostgreSQL 문서
본문
Synopsis
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 ]
[ , MFINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
[ , 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 ]
[ , PARALLEL = { SAFE | RESTRICTED | UNSAFE } ]
[ , HYPOTHETICAL ]
)
or the old syntax
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 ]
)
Description
CREATE AGGREGATE는 새 집계 함수를 정의해요. CREATE OR REPLACE AGGREGATE는 새 집계 함수를 정의하거나 기존 정의를 교체해요. 몇몇 기본적이고 흔히 쓰이는 집계 함수는 배포판에 포함되어 있으며 9.21 절에 문서화되어 있어요. 새 타입을 정의했거나 아직 제공되지 않는 집계 함수가 필요하다면 CREATE AGGREGATE를 사용해 원하는 기능을 제공할 수 있어요.
기존 정의를 교체할 때는 인자 타입, 결과 타입, 직접 인자(direct argument)의 수를 변경할 수 없어요. 또한 새 정의는 기존 것과 같은 종류(일반 집계, 정렬 집합 집계, 또는 가상 집합 집계)여야 해요.
스키마 이름이 주어지면(예: CREATE AGGREGATE myschema.myagg ...) 집계 함수는 지정된 스키마에 생성돼요. 그렇지 않으면 현재 스키마에 생성돼요.
집계 함수는 그 이름과 입력 데이터 타입(들)으로 식별돼요. 같은 스키마의 두 집계가 서로 다른 입력 타입으로 동작한다면 같은 이름을 가질 수 있어요. 집계의 이름과 입력 데이터 타입(들)은 같은 스키마의 모든 일반 함수의 이름과 입력 데이터 타입(들)과도 구별되어야 해요. 이 동작은 일반 함수 이름의 오버로딩과 동일해요 (CREATE FUNCTION 참고).
간단한 집계 함수는 하나 또는 두 개의 일반 함수로 만들어져요. 상태 전이 함수 *sfunc*와 선택적인 최종 계산 함수 *ffunc*예요. 이들은 다음과 같이 사용돼요:
sfunc( internal-state, next-data-values ) ---> next-internal-state
ffunc( internal-state ) ---> aggregate-value
PostgreSQL은 집계의 현재 내부 상태를 담을 stype 데이터 타입의 임시 변수를 생성해요. 각 입력 행에서 집계 인자 값(들)이 계산되고, 현재 상태 값과 새 인자 값(들)으로 상태 전이 함수가 호출되어 새 내부 상태 값을 계산해요. 모든 행이 처리된 후 최종 함수가 한 번 호출되어 집계의 반환 값을 계산해요. 최종 함수가 없으면 끝 상태 값이 그대로 반환돼요.
집계 함수는 초기 조건(initial condition), 즉 내부 상태 값의 초기 값을 제공할 수 있어요. 이는 text 타입의 값으로 지정되어 데이터베이스에 저장되지만, 상태 값 데이터 타입 상수의 유효한 외부 표현이어야 해요. 제공되지 않으면 상태 값은 null로 시작해요.
상태 전이 함수가 "strict"(엄격)로 선언되면 null 입력으로 호출될 수 없어요. 그런 전이 함수로 집계 실행은 다음과 같이 동작해요. null 입력 값을 가진 행은 무시돼요 (함수가 호출되지 않고 이전 상태 값이 유지돼요). 초기 상태 값이 null이면, 모두 비-null 입력 값을 가진 첫 행에서 첫 번째 인자 값이 상태 값을 대체하고, 그 이후의 각 비-null 입력 행마다 전이 함수가 호출돼요. 이는 max 같은 집계를 구현하는 데 유용해요. 이 동작은 *state_data_type*이 첫 *arg_data_type*과 같을 때만 사용할 수 있다는 점을 참고하세요. 이 타입들이 다르면 비-null 초기 조건을 제공하거나 비-strict 전이 함수를 사용해야 해요.
상태 전이 함수가 strict가 아니면 각 입력 행에서 무조건 호출되며, null 입력과 null 상태 값을 스스로 처리해야 해요. 이는 집계 작성자가 null 값에 대한 집계 처리에 완전한 제어권을 가질 수 있게 해줘요.
최종 함수가 "strict"로 선언되면 끝 상태 값이 null일 때 호출되지 않고, 대신 null 결과가 자동으로 반환돼요. (물론 이는 strict 함수의 정상적인 동작이에요.) 어쨌든 최종 함수는 null 값을 반환하는 옵션을 가져요. 예를 들어 avg의 최종 함수는 입력 행이 0개였음을 알면 null을 반환해요.
때로는 최종 함수가 상태 값뿐 아니라 집계의 입력 값에 해당하는 추가 매개변수를 받도록 선언하는 것이 유용해요. 이렇게 하는 주된 이유는 최종 함수가 다형성(polymorphic)이고 상태 값의 데이터 타입이 결과 타입을 고정하기에 부적합할 때예요. 이 추가 매개변수는 항상 NULL로 전달돼요 (그래서 FINALFUNC_EXTRA 옵션을 사용할 때 최종 함수는 strict가 아니어야 해요), 그럼에도 유효한 매개변수예요. 최종 함수는 예를 들어 get_fn_expr_argtype를 사용해 현재 호출의 실제 인자 타입을 식별할 수 있어요.
집계는 선택적으로 36.12.1 절에 설명된 대로 이동 집계 모드(moving-aggregate mode)를 지원할 수 있어요. 이는 MSFUNC, MINVFUNC, MSTYPE 매개변수와 선택적으로 MSSPACE, MFINALFUNC, MFINALFUNC_EXTRA, MFINALFUNC_MODIFY, MINITCOND 매개변수를 지정해야 해요. MINVFUNC를 제외하면 이 매개변수들은 M 없는 해당 단순 집계 매개변수처럼 동작해요. 이들은 역 전이 함수(inverse transition function)를 포함하는 집계의 별도 구현을 정의해요.
매개변수 목록의 ORDER BY 문법은 정렬 집합 집계(ordered-set aggregate)라는 특별한 종류의 집계를 만들고, HYPOTHETICAL이 지정되면 가상 집합 집계(hypothetical-set aggregate)가 만들어져요. 이 집계들은 순서 의존적인 방식으로 정렬된 값 그룹에 대해 동작하므로, 입력 정렬 순서의 지정이 호출의 필수 부분이에요. 또한 이들은 직접 인자(direct argument)를 가질 수 있는데, 이는 입력 행당 한 번이 아니라 집계당 한 번만 평가되는 인자예요. 가상 집합 집계는 정렬 집합 집계의 하위 클래스로, 일부 직접 인자가 수와 데이터 타입에서 집계된 인자 컬럼과 일치해야 해요. 이는 그 직접 인자들의 값을 추가적인 "가상" 행으로 집계 입력 행 모음에 더할 수 있게 해줘요.
집계는 선택적으로 36.12.4 절에 설명된 대로 부분 집계(partial aggregation)를 지원할 수 있어요. 이는 COMBINEFUNC 매개변수를 지정해야 해요. *state_data_type*이 internal이면 병렬 집계를 가능하게 하기 위해 SERIALFUNC과 DESERIALFUNC 매개변수를 제공하는 것이 보통 적절해요. 또한 병렬 집계를 활성화하려면 집계가 PARALLEL SAFE로 표시되어야 한다는 점을 참고하세요.
MIN 또는 MAX처럼 동작하는 집계는 때때로 모든 입력 행을 스캔하는 대신 인덱스를 들여다봄으로써 최적화될 수 있어요. 이 집계가 그렇게 최적화될 수 있다면 정렬 연산자(sort operator)를 지정해 나타내요. 기본 요구 사항은 집계가 연산자가 유도하는 정렬 순서의 첫 번째 요소를 산출해야 한다는 거예요. 즉:
SELECT agg(col) FROM tab;
이것은 다음과 동등해야 해요:
SELECT col FROM tab ORDER BY col USING sortop LIMIT 1;
추가 가정은 집계가 null 입력을 무시하고, 비-null 입력이 없을 때에만 null 결과를 산출한다는 거예요. 보통 데이터 타입의 < 연산자가 MIN의 적절한 정렬 연산자이고, >가 MAX의 적절한 정렬 연산자예요. 이 최적화는 지정된 연산자가 B-tree 인덱스 연산자 클래스의 "less than" 또는 "greater than" 전략 멤버가 아니면 실제로 적용되지 않는다는 점을 참고하세요.
집계 함수를 만들려면 인자 타입, 상태 타입(들), 반환 타입에 대한 USAGE 권한과, 지원 함수에 대한 EXECUTE 권한이 있어야 해요.
Parameters
name
생성할 집계 함수의 이름이에요 (선택적으로 스키마 한정).
argmode
인자의 모드로 IN 또는 VARIADIC예요. (집계 함수는 OUT 인자를 지원하지 않아요.) 생략하면 기본값은 IN이에요. 마지막 인자만 VARIADIC로 표시될 수 있어요.
argname
인자의 이름이에요. 현재는 문서화 목적으로만 유용해요. 생략하면 인자는 이름이 없어요.
arg_data_type
이 집계 함수가 동작하는 입력 데이터 타입이에요. 인자 사양 목록 대신 *를 작성해 0인자 집계 함수를 만들 수 있어요. (그런 집계의 예는 count(*)예요.)
base_type
CREATE AGGREGATE의 옛 문법에서 입력 데이터 타입은 집계 이름 옆에 작성하는 대신 basetype 매개변수로 지정돼요. 이 문법은 입력 매개변수 하나만 허용한다는 점을 참고하세요. 이 문법으로 0인자 집계 함수를 정의하려면 basetype을 "ANY"로 지정해요 (*가 아님). 정렬 집합 집계는 옛 문법으로 정의할 수 없어요.
sfunc
각 입력 행에 대해 호출되는 상태 전이 함수의 이름이에요. 일반적인 N-인자 집계 함수의 경우 *sfunc*는 N+1개의 인자를 받아야 하고, 첫 번째는 state_data_type 타입이고 나머지는 집계의 선언된 입력 데이터 타입(들)과 일치해야 해요. 함수는 state_data_type 타입의 값을 반환해야 해요. 이 함수는 현재 상태 값과 현재 입력 데이터 값(들)을 받아 다음 상태 값을 반환해요.
정렬 집합(가상 집합 포함) 집계의 경우 상태 전이 함수는 현재 상태 값과 집계된 인자들만 받지, 직접 인자는 받지 않아요. 그 외에는 동일해요.
state_data_type
집계의 상태 값을 위한 데이터 타입이에요.
state_data_size
집계의 상태 값의 대략적인 평균 크기(바이트)예요. 이 매개변수를 생략하거나 0이면 *state_data_type*에 기반한 기본 추정값이 사용돼요. 플래너는 이 값을 사용해 그룹화된 집계 쿼리에 필요한 메모리를 추정해요.
ffunc
모든 입력 행을 탐색한 후 집계의 결과를 계산하기 위해 호출되는 최종 함수의 이름이에요. 일반 집계의 경우 이 함수는 state_data_type 타입의 단일 인자를 받아야 해요. 집계의 반환 데이터 타입은 이 함수의 반환 타입으로 정의돼요. *ffunc*을 지정하지 않으면 끝 상태 값이 집계의 결과로 사용되고, 반환 타입은 *state_data_type*이에요.
정렬 집합(가상 집합 포함) 집계의 경우 최종 함수는 최종 상태 값뿐 아니라 모든 직접 인자의 값도 받아요.
FINALFUNC_EXTRA를 지정하면 최종 상태 값과 직접 인자들 외에, 집계의 일반(집계된) 인자에 해당하는 추가 NULL 값도 최종 함수가 받아요. 이는 주로 다형성 집계를 정의할 때 집계 결과 타입의 올바른 해석을 허용하는 데 유용해요.
FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE }
이 옵션은 최종 함수가 그 인자를 수정하지 않는 순수 함수인지 지정해요. READ_ONLY는 수정하지 않음을 나타내고, 나머지 두 값은 전이 상태 값을 변경할 수 있음을 나타내요. 자세한 내용은 아래의 Notes를 참고해요. 기본값은 READ_ONLY인데, 정렬 집합 집계의 기본값은 READ_WRITE예요.
combinefunc
combinefunc 함수는 선택적으로 지정되어 집계 함수가 부분 집계를 지원할 수 있게 해줘요. 제공되면 *combinefunc*는 두 개의 state_data_type 값(각각 입력 값의 일부 부분 집합에 대한 집계 결과를 담고 있음)을 결합해 두 입력 집합 모두에 대해 집계한 결과를 나타내는 새 *state_data_type*을 만들어야 해요. 이 함수는 *sfunc*으로 생각할 수 있는데, 개별 입력 행에 작용해 그것을 실행 중인 집계 상태에 추가하는 대신 다른 집계 상태를 실행 중인 상태에 추가해요.
*combinefunc*는 *state_data_type*의 두 인자를 받고 state_data_type 값을 반환하도록 선언되어야 해요. 선택적으로 이 함수는 "strict"일 수 있어요. 이 경우 입력 상태 중 하나라도 null이면 함수가 호출되지 않고, 다른 상태가 올바른 결과로 취해져요.
*state_data_type*이 internal인 집계 함수의 경우 *combinefunc*는 strict가 아니어야 해요. 이 경우 *combinefunc*는 null 상태를 올바르게 처리하고, 반환되는 상태가 집계 메모리 컨텍스트에 제대로 저장되도록 보장해야 해요.
serialfunc
*state_data_type*이 internal인 집계 함수는 serialfunc 함수가 있어야만 병렬 집계에 참여할 수 있는데, 이 함수는 집계 상태를 bytea 값으로 직렬화해 다른 프로세스로 전송해야 해요. 이 함수는 internal 타입의 단일 인자를 받고 bytea 타입을 반환해야 해요. 해당하는 *deserialfunc*도 필요해요.
deserialfunc
이전에 직렬화된 집계 상태를 다시 *state_data_type*으로 역직렬화해요. 이 함수는 bytea와 internal 타입의 두 인자를 받고 internal 타입 결과를 만들어야 해요. (참고: 두 번째 internal 인자는 사용되지 않지만 타입 안전성 이유로 필요해요.)
initial_condition
상태 값의 초기 설정이에요. state_data_type 데이터 타입에 허용되는 형태의 문자열 상수여야 해요. 지정하지 않으면 상태 값은 null로 시작해요.
msfunc
이동 집계 모드에서 각 입력 행에 대해 호출되는 정방향 상태 전이 함수의 이름이에요. 첫 번째 인자와 결과가 *state_data_type*과 다를 수 있는 mstate_data_type 타입이라는 점을 제외하면 일반 전이 함수와 정확히 같아요.
minvfunc
이동 집계 모드에서 사용되는 역 상태 전이 함수의 이름이에요. 이 함수는 *msfunc*과 같은 인자 및 결과 타입을 가지지만, 값을 상태에 추가하는 대신 현재 집계 상태에서 값을 제거하는 데 사용돼요. 역 전이 함수는 정방향 상태 전이 함수와 같은 strictness 특성을 가져야 해요.
mstate_data_type
이동 집계 모드 사용 시 집계의 상태 값을 위한 데이터 타입이에요.
mstate_data_size
이동 집계 모드 사용 시 집계의 상태 값의 대략적인 평균 크기(바이트)예요. *state_data_size*와 동일하게 동작해요.
mffunc
이동 집계 모드 사용 시 모든 입력 행을 탐색한 후 집계의 결과를 계산하기 위해 호출되는 최종 함수의 이름이에요. *ffunc*과 동일하게 동작하지만, 첫 인자 타입이 *mstate_data_type*이고 추가 더미 인자는 MFINALFUNC_EXTRA를 작성해 지정해요. mffunc 또는 *mstate_data_type*으로 결정된 집계 결과 타입은 집계의 일반 구현으로 결정된 것과 일치해야 해요.
MFINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE }
이 옵션은 FINALFUNC_MODIFY와 같지만 이동 집계 최종 함수의 동작을 설명해요.
minitial_condition
이동 집계 모드 사용 시 상태 값의 초기 설정이에요. *initial_condition*과 동일하게 동작해요.
sort_operator
MIN- 또는 MAX-류 집계의 연결된 정렬 연산자예요. 이것은 연산자 이름일 뿐이에요 (스키마 한정일 수 있어요). 연산자는 집계와 같은 입력 데이터 타입을 가진다고 가정돼요 (단일 인자 일반 집계여야 해요).
PARALLEL = { SAFE | RESTRICTED | UNSAFE }
PARALLEL SAFE, PARALLEL RESTRICTED, PARALLEL UNSAFE의 의미는 CREATE FUNCTION에서와 같아요. 집계가 PARALLEL UNSAFE(기본값입니다!) 또는 PARALLEL RESTRICTED로 표시되면 병렬화 대상으로 고려되지 않아요. 집계의 지원 함수들의 병렬 안전 표시는 플래너가 참고하지 않고, 집계 자체의 표시만 참고한다는 점을 참고하세요.
HYPOTHETICAL
정렬 집합 집계에서만, 이 플래그는 집계 인자가 가상 집합 집계의 요구 사항에 따라 처리될 것을 지정해요. 즉 마지막 몇 개의 직접 인자가 집계된(WITHIN GROUP) 인자의 데이터 타입과 일치해야 해요. HYPOTHETICAL 플래그는 런타임 동작에는 영향을 미치지 않고, 집계 인자의 데이터 타입과 콜레이션의 파싱 시점 해석에만 영향을 미쳐요.
CREATE AGGREGATE의 매개변수들은 위에 설명된 순서뿐 아니라 어떤 순서로든 작성할 수 있어요.
Notes
지원 함수 이름을 지정하는 매개변수에서는 필요하면 스키마 이름을 작성할 수 있어요, 예: SFUNC = public.sum. 다만 거기에 인자 타입을 작성하지 마세요. 지원 함수의 인자 타입은 다른 매개변수에서 결정되거든요.
보통 PostgreSQL 함수는 그 입력 값을 수정하지 않는 진정한 함수로 기대돼요. 하지만 집계 전이 함수는, 집계의 문맥에서 사용될 때는, 그 전이 상태 인자를 제자리에서 수정해도 되는 치트가 허용돼요. 이는 매번 전이 상태의 새 사본을 만드는 것보다 상당한 성능 이점을 제공할 수 있어요.
마찬가지로 집계 최종 함수는 보통 입력 값을 수정하지 않는 것으로 기대되지만, 때로는 전이 상태 인자를 수정하는 것을 피하는 것이 비실용적일 때가 있어요. 그런 동작은 FINALFUNC_MODIFY 매개변수를 사용해 선언해야 해요. READ_WRITE 값은 최종 함수가 전이 상태를 지정되지 않은 방식으로 수정함을 나타내요. 이 값은 집계를 창 함수(window function)로 사용하는 것을 막고, 같은 입력 값과 전이 함수를 공유하는 집계 호출에 대한 전이 상태의 병합도 막아요. SHAREABLE 값은 전이 함수가 최종 함수 후에 적용될 수 없지만, 끝 전이 상태 값에 대해 여러 최종 함수 호출을 수행할 수 있음을 나타내요. 이 값은 집계를 창 함수로 사용하는 것을 막지만 전이 상태의 병합은 허용해요. (즉 여기서 관심 있는 최적화는 같은 최종 함수를 반복 적용하는 것이 아니라, 같은 끝 전이 상태 값에 다른 최종 함수들을 적용하는 거예요. 이는 어떤 최종 함수도 READ_WRITE로 표시되지 않는 한 허용돼요.)
집계가 이동 집계 모드를 지원하면, 집계가 이동 프레임 시작(즉 UNBOUNDED PRECEDING 이외의 프레임 시작 모드)을 가진 창의 창 함수로 사용될 때 계산 효율이 향상돼요. 개념적으로 정방향 전이 함수는 입력 값이 아래쪽에서 창 프레임에 들어올 때 집계 상태에 추가하고, 역 전이 함수는 값이 위쪽에서 프레임을 떠날 때 다시 제거해요. 따라서 값이 제거될 때 항상 추가된 순서와 같은 순서로 제거돼요. 역 전이 함수가 호출될 때마다, 따라서 가장 일찍 추가되었지만 아직 제거되지 않은 인자 값(들)을 받게 돼요. 역 전이 함수는 가장 오래된 행을 제거한 후 현재 상태에 최소한 한 행이 남을 것이라고 가정할 수 있어요. (그렇지 않은 경우 창 함수 메커니즘은 역 전이 함수를 사용하는 대신 새 집계를 시작해요.)
이동 집계 모드의 정방향 전이 함수는 새 상태 값으로 NULL을 반환할 수 없어요. 역 전이 함수가 NULL을 반환하면, 이는 역 함수가 이 특정 입력에 대해 상태 계산을 되돌릴 수 없다는 표시로 받아들여지고, 따라서 집계 계산은 현재 프레임 시작 위치에서 처음부터 다시 수행돼요. 이 관례는 실행 중인 상태 값에서 역산하는 것이 비실용적인 드문 경우가 있는 상황에서 이동 집계 모드를 사용할 수 있게 해줘요.
이동 집계 구현이 제공되지 않으면 집계는 이동 프레임과 함께 사용될 수 있지만, 프레임의 시작이 이동할 때마다 PostgreSQL이 전체 집계를 다시 계산해요. 집계가 이동 집계 모드를 지원하는지 여부와 무관하게 PostgreSQL은 이동 프레임 끝을 재계산 없이 처리할 수 있다는 점을 참고하세요. 이는 집계 상태에 새 값을 계속 추가하면서 수행되기 때문이에요. 그래서 집계를 창 함수로 사용하려면 최종 함수가 읽기 전용이어야 해요. 최종 함수는 집계의 상태 값을 손상시켜서는 안 되며, 한 프레임 경계 집합에 대해 집계 결과 값이 얻어진 후에도 집계가 계속될 수 있어야 해요.
정렬 집합 집계의 문법은 마지막 직접 매개변수와 마지막 집계(WITHIN GROUP) 매개변수 모두에 VARIADIC 지정을 허용해요. 하지만 현재 구현은 VARIADIC의 사용을 두 가지로 제한해요. 첫째, 정렬 집합 집계는 VARIADIC "any"만 사용할 수 있고 다른 가변 배열 타입은 사용할 수 없어요. 둘째, 마지막 직접 매개변수가 VARIADIC "any"이면 집계 매개변수는 하나만 있을 수 있고 그것도 VARIADIC "any"여야 해요. (시스템 카탈로그에서 사용되는 표현에서는 두 매개변수가 단일 VARIADIC "any" 항목으로 병합되는데, pg_proc는 둘 이상의 VARIADIC 매개변수를 가진 함수를 표현할 수 없기 때문이에요.) 집계가 가상 집합 집계면 VARIADIC "any" 매개변수와 일치하는 직접 인자가 가상 인자들이고, 앞의 매개변수들은 집계된 인자와 일치하도록 제한되지 않는 추가 직접 인자를 나타내요.
현재 정렬 집합 집계는 창 함수로 사용될 수 없으므로 이동 집계 모드를 지원할 필요가 없어요.
부분(병렬 포함) 집계는 현재 정렬 집합 집계에서 지원되지 않아요. 또한 DISTINCT 또는 ORDER BY 절을 포함하는 집계 호출에는 절대 사용되지 않는데, 그 의미론은 부분 집계 중에는 지원될 수 없기 때문이에요.
Examples
36.12 절을 참고해요.
Compatibility
CREATE AGGREGATE는 PostgreSQL 언어 확장이에요. SQL 표준은 사용자 정의 집계 함수를 제공하지 않아요.