이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다범퍼카 토토 PostgreSQL : 문서 : 17 : 36.12. 사용자 정의 골재버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

35.10. 사용자 정의 골재

무지개 토토 함수PostgreSQL상태 값and상태 전환 기능. 즉, 골재는 각 연속 입력 행이 처리되면 업데이트되는 상태 값을 사용하여 작동합니다. 새로운 무지개 토토 함수를 정의하기 위해 상태 값에 대한 데이터 유형, 상태의 초기 값 및 상태 전환 기능을 선택합니다. 상태 전환 함수는 현재 행에 대한 이전 상태 값과 집계의 입력 값을 취하고 새로운 상태 값을 반환합니다. 에이최종 기능집계의 원하는 결과가 실행 상태 값으로 유지되어야하는 데이터와 다를 경우에도 지정할 수 있습니다. 최종 기능은 마지막 상태 값을 취하고 원하는 모든 것을 집계 결과로 반환합니다. 원칙적으로, 전환 및 최종 기능은 집계의 맥락 외부에서도 사용할 수있는 일반적인 기능 일뿐입니다. (실제로는 종종 집계의 일부로 호출 될 때만 작동 할 수있는 특수 전환 기능을 만들 수있는 성능의 이유에 도움이됩니다.)

따라서 집계 사용자가 보이는 인수 및 결과 데이터 유형 외에도 인수 및 결과 유형과 다를 수있는 내부 상태 값 데이터 유형이 있습니다.

최종 함수를 사용하지 않는 무지개 토토를 정의하면 각 행에서 열 값의 실행중인 함수를 계산하는 무지개 토토가 있습니다..Sum이런 종류의 무지개 토토의 예입니다.Sum0에서 시작하여 항상 현재 행 값을 실행 총계에 추가합니다. 예를 들어, 우리가 a를 만들고 싶다면Sum복소수의 데이터 유형에서 작동하는 집계는 해당 데이터 유형에 대한 추가 기능 만 있으면됩니다. 집계 정의는 다음과 같습니다.

무지개 토토 합계 생성 (복잡함)
(
    sfunc = complex_add,
    stype = complex,
    initcond = '(0,0)'
);

우리가 다음과 같이 사용할 수있는 것 :

test_complex에서 합 (a)을 선택하십시오.

   합집합
----------
 (34,53.9)

(기능 과부하에 의존하고 있음을 알 수 있습니다.Sum그러나PostgreSQL유형의 열에 어떤 종류의 합이 적용되는지 알아낼 수 있습니다복잡한.)

위의 정의Sumunnull 입력 값이없는 경우 0 (초기 상태 값)을 반환합니다. 아마도 우리는 그 경우에 NULL을 반환하고 싶을 것입니다 - SQL 표준은 기대입니다.Sum그렇게 행동합니다. 우리는 단순히를 생략하여 이것을 할 수 있습니다.initcond문구, 초기 상태 값이 무일하게 이루어집니다. 일반적으로 이것은sfunc널 상태 가치 입력을 확인해야합니다. 하지만Sum그리고 다른 간단한 무지개 토토와 같은maxMinPostgreSQL초기 상태 값이 NULL이고 전환 함수가 표시되면 자동으로 수행합니다"엄격한"(즉, 널 입력을 요구하지 않음).

A에 대한 또 다른 기본 동작"엄격한"전이 함수는 널 입력 값이 발생할 때마다 이전 상태 값이 변경되지 않음을 유지한다는 것입니다. 따라서 널 값은 무시됩니다. 널 입력에 대한 다른 동작이 필요한 경우 전환 기능을 엄격하게 선언하지 마십시오. 대신 널 입력을 테스트하고 필요한 모든 것을 수행하도록 코딩하십시오.

avg(평균)는 집계의 더 복잡한 예입니다. 입력의 합과 입력 수의 수의 두 가지 런닝 상태가 필요합니다. 최종 결과는 이러한 수량을 나누어 얻습니다. 평균은 일반적으로 배열을 상태 값으로 사용하여 구현됩니다. 예를 들어, 내장 구현avg (float8)모양 :

집계 AVG 생성 (float8)
(
    sfunc = float8_accum,
    stype = float8 [],
    finalfunc = float8_avg,
    initcond = '0,0,0'
);

참고 : float8_accum는 제곱의 합과 입력의 합계와 수를 축적하기 때문에 두 요소가 아닌 3 요소 배열이 필요합니다. 이것은 다른 골재와에 사용될 수 있도록avg.

SQL 허용의 무지개 토토 함수 호출별도의and주문 by무지개 토토의 전환 기능에 공급되는 행을 제어하는 옵션 및 순서대로. 이 옵션은 무대 뒤에서 구현되며 무지개 토토의 지원 기능의 관심사가 아닙니다.

자세한 내용은 참조하십시오.PostgreSQL : 문서 : 9.5 : 스포츠 토토 사이트 생성명령.

35.10.1. 이동 모드 이동

무지개 토토 함수는 선택적으로 지원할 수 있습니다이동 모드,이를 통해 프레임 시작점이 움직이는 Windows 내에서 무지개 토토 함수를 실질적으로 더 빠르게 실행할 수 있습니다. (보다4800 |6000 사설 토토0 |4800 |6000 사설 토토0 |6000 사설 토토0 |_4800 |6000 사설 토토0 |6000 사설 토토0 |4800 |500 사설 토토0 |4800 |6000 사설 토토0 |6000 사설 토토0 |4800 |4800 |500 사설 토토0 사설 토토0 사설 토토0 |6and섹션 4.2.8창 함수로 무지개 토토 함수의 사용에 대한 정보는 기본 아이디어는 정상 외에도이라는 것입니다."Forward"전이 함수, 무지개 토토는 at을 제공합니다.역전전 함수, 창 프레임을 종료 할 때 집계의 실행 상태 값에서 행을 제거 할 수 있습니다. 예를 들어 ASum전환 전환 함수로 첨가를 사용하는 무지개 토토는 뺄셈을 역 전이 함수로 사용합니다. 역 전이 함수가 없으면, 창 함수 메커니즘은 프레임 시작점이 움직일 때마다 총체를 처음부터 다시 계산해야하므로 입력 행의 수에 비례하여 평균 프레임 길이의 시간에 비례합니다. 역전 전이 함수의 경우, 실행 시간은 입력 행의 수에만 비례합니다.

역 전이 함수는 현재 상태에 포함 된 최초의 행에 대한 현재 상태 값과 집계 입력 값이 전달됩니다. 주어진 입력 행이 집계되지 않은 경우 상태 값이 무엇인지 재구성해야합니다. 이를 위해서는 전방 전환 기능이 일반 집계 모드에 필요한 것보다 더 많은 상태를 유지해야합니다. 따라서 이동 응집 모드는 일반 모드와 완전히 별도의 구현을 사용합니다. 자체 상태 데이터 유형, 자체 전달 전환 기능 및 필요한 경우 자체 최종 기능이 있습니다. 추가 상태가 필요하지 않은 경우 일반 모드의 데이터 유형 및 기능과 동일 할 수 있습니다.

예를 들어를 확장 할 수 있습니다.Sum이와 같은 이동 모드를 지원하기위한 위의 집계 :

집계 합계 생성 (복잡한)
(
    sfunc = complex_add,
    stype = complex,
    initcond = '(0,0)',
    msfunc = complex_add,
    minvfunc = complex_sub,
    mstype = complex,
    minitcond = '(0,0)'
);

이름으로 시작하는 매개 변수M이동 응집 구현을 정의하십시오. 역 전이 함수를 제외하고minvfunc, 이들은없이 평범한 매개 변수에 해당합니다M.

이동 응집 모드의 전방 전환 함수는 NULL을 새로운 상태 값으로 반환 할 수 없습니다. 역 전이 함수가 NULL을 반환하면 역 함수 가이 특정 입력에 대한 상태 계산을 역전시킬 수 없다는 표시로 간주되므로 총 계산은 현재 프레임 시작 위치에 대해 처음부터 다시 작성됩니다. 이 협약을 사용하면 런닝 상태 값을 뒤집어 놓는 데 실용적이지 않은 일부 드문 경우가있는 상황에서 이동 응집 모드를 사용할 수 있습니다. 역 전이 함수는"펀트"이 경우에도 대부분의 경우 작동 할 수있는 한 여전히 앞서 나옵니다. 예를 들어, 부동 소수점 숫자로 작업하는 무지개 토토는 A를 펀트 할 수 있습니다.Nan(숫자가 아님) 입력을 실행중인 상태 값에서 제거해야합니다.

이동 응집 지원 기능을 작성할 때 역전전 함수가 올바른 상태 값을 정확하게 재구성 할 수 있는지 확인하는 것이 중요합니다. 그렇지 않으면 이동 응집 모드가 사용되는지 여부에 따라 결과에 사용자가 눈에 띄는 차이가있을 수 있습니다. 역 전이 기능을 추가하는 집계의 예는 처음에는 쉬운 것처럼 보이지만이 요구 사항이 충족 될 수없는 곳은입니다.SumOverfloat4또는float8입력. 순진한 선언Sum (float8)

무지개 토토 생성 unsafe_sum (float8)
(
    stype = float8,
    sfunc = float8pl,
    mstype = float8,
    msfunc = float8pl,
    minvfunc = float8mi
);

이 무지개 토토는 역 전이 기능이없는 것과는 다른 결과를 제공 할 수 있습니다. 예를 들어, 고려

선택
  insafe_sum (x) 오버 (현재 행과 1 회 사이의 n 행으로 주문)
From (1, 1.0e20 :: float8),
             (2, 1.0 :: float8)) as v (n, x);

이 쿼리가 반환0두 번째 결과로서, 예상 대답이 아니라1. 원인은 부동 소수점 값의 제한된 정밀도입니다. 추가1to1E20결과1E20다시, 너무 빼기1E20그 수율에서0, 아님1. 이것은 일반적으로 부동 소수점 산술의 한계가 아니라의 한계입니다.PostgreSQL.

35.10.2. 다형성 및 변수 응집체

무지개 토토 함수는 다형성 상태 전이 함수 또는 최종 함수를 사용하여 동일한 함수를 사용하여 여러 집계를 구현할 수 있습니다. 보다섹션 35.2.5다형성 기능에 대한 설명. 한 걸음 더 나아가서, 골재 기능 자체는 다형성 입력 유형 및 상태 유형으로 지정 될 수 있으므로 단일 집계 정의가 다중 입력 데이터 유형에 사용될 수 있습니다. 다형성 집계의 예는 다음과 같습니다.

무지개 토토 생성 array_accum (anylement)
(
    sfunc = array_append,
    stype = anyArray,
    initcond = ''
);

여기서, 주어진 집계 호출의 실제 상태 유형은 실제 입력 유형을 요소로하는 배열 유형입니다. 골재의 동작은 모든 입력을 해당 유형의 배열로 연결하는 것입니다. (참고 : 내장 골재array_agg이 정의보다 더 나은 성능으로 유사한 기능을 제공합니다.)

여기에는 두 가지 실제 데이터 유형을 인수로 사용하는 출력이 있습니다 :

attrelid :: regclass, array_accum (Attname)
    pg_attribute에서
    여기서 attnum 0 및 attrelid = 'pg_tablespace':: regclass
    Attrelid에 의한 그룹;

   attrelid |              Array_accum              
---------------+------------------------------------------------
 PG_TABLESPACE | spcname, spcowner, spcacl, spcoptions

일반적으로, 다형성 결과 유형을 갖는 무지개 토토 함수는 위의 예에서와 같이 다형성 상태 유형을 갖는다. 그렇지 않으면 최종 기능이 현명하게 선언 될 수 없기 때문에 필요합니다. 다형성 결과 유형이 필요하지만 다형성 인수 유형은 없어야합니다.함수 만들기결과 유형을 통화에서 추론 할 수 없다는 이유로 거부됩니다. 그러나 때로는 다형성 상태 유형을 사용하는 것이 불편합니다. 가장 일반적인 사례는 집계지지 기능이 C로 작성되고 상태 유형이로 선언되어야하는 곳입니다.내부SQL 레벨이 없기 때문에. 이 사례를 해결하기 위해 최종 기능을 추가로 취하는 것으로 선언 할 수 있습니다"더미"집계의 입력 인수와 일치하는 인수. 이러한 더미 인수는 최종 함수를 호출 할 때 특정 값을 사용할 수 없기 때문에 항상 널 값으로 전달됩니다. 그들의 유일한 용도는 다형성 최종 함수의 결과 유형이 집계의 입력 유형에 연결되도록하는 것입니다. 예를 들어, 내장 집계의 정의array_agg

함수 생성 array_agg_transfn (내부, AnynonArray)
  내부를 반환합니다 ...;
기능 생성 array_agg_finalfn (내부, AnynonArray)
  anyArray를 반환합니다 ...;

Aggregate array_agg 만들기 (AnynonArray)
(
    sfunc = array_agg_transfn,
    stype = 내부,
    finalfunc = array_agg_finalfn,
    FinalFunc_extra
);

여기,FinalFunc_extra옵션은 상태 값 외에 최종 함수가 수신되는 것을 지정합니다. 추가AnynonArray인수는 선언을 허용합니다.array_agg_finalfn유효하려면.

마지막 인수를 A로 선언함으로써 다양한 수의 인수를 받아들이도록 무지개 토토 함수를 만들 수 있습니다.variadic배열, 정기적 인 기능과 거의 같은 방식으로; 보다섹션 35.4.5. 무지개 토토의 전환 함수는 마지막 인수와 동일한 배열 유형을 가져야합니다. 전이 함수 (들)도 일반적으로 표시됩니다variadic, 그러나 이것은 엄격하게 필요하지 않습니다.

참고 :variadic 응집체는와 관련하여 쉽게 오용됩니다주문 by옵션 (참조섹션 4.2.7), 파서는 실제 인수의 잘못된 수가 그러한 조합으로 제공되었는지 여부를 알 수 없기 때문에. 의 오른쪽에있는 모든 것을 명심하십시오.주문는 총 키입니다. 예를 들어,

MyAggregate (A, B, C)에서 선택한 ...

파서는 이것을 단일 무지개 토토 함수 인수와 3 개의 정렬 키로 볼 것입니다. 그러나 사용자가 의도했을 수도 있습니다

myaggregate (a, b, c 주문 a)에서 ... 선택하십시오.

ifmyaggregatevariadic,이 두 통화는 완벽하게 유효 할 수 있습니다.

같은 이유로, 동일한 이름과 다른 수의 일반 인수로 무지개 토토 함수를 만들기 전에 두 번 생각하는 것이 현명합니다.

35.10.3. 순서 대기업

지금까지 설명한 무지개 토토는"정상"무지개 토토.PostgreSQL지원주문 세트 골재, 이는 두 가지 주요 방식으로 정상 응집체와 다릅니다. 첫째, 입력 행 당 한 번 평가되는 일반적인 무지개 토토 인수 외에도 순서 세트 무지개 토토는 가질 수 있습니다"Direct"집계 작업 당 한 번만 평가되는 인수. 둘째, 일반적인 집계 된 인수에 대한 구문은 명시 적으로 정렬 순서를 지정합니다. 순서 세트 집계는 일반적으로 특정 행 순서 (예 : 순위 또는 백분위 수)에 의존하는 계산을 구현하는 데 사용되므로 정렬 순서는 모든 통화의 필수 측면이되도록합니다. 예를 들어,의 내장 정의백분석 _DISC와 동일합니다.

함수 작성 ordered_set_transition (내부, Anylement)
  내부를 반환합니다 ...;
기능 생성 백분위 수수료 _disc_final (내부, float8, anylement)
  모든 요소를 반환합니다 ...;

Aggregate alterile_disc 만들기 (anylement의 float8 주문)
(
    sfunc = ordered_set_transition,
    stype = 내부,
    finalfunc = alterile_disc_final,
    FinalFunc_extra
);

이 무지개 토토는 a를 취합니다.float8직접 인수 (백분위 수 분율) 및 정렬 가능한 데이터 유형 일 수있는 집계 된 입력. 다음과 같은 평균 가계 소득을 얻는 데 사용될 수 있습니다.

가구에서 그룹 내 (소득 별) 내에서 백분위 수 _DISC (0.5)를 선택하십시오.
 백분위 수 _disc
------------------
           50489

여기,0.5직접적인 논쟁입니다. 백분위 수 분율이 행에 따라 다양한 값이되는 것은 의미가 없습니다.

정상 무지개 토토의 경우와 달리 순서 세트 무지개 토토의 입력 행의 정렬은입니다.not무대 뒤에서 완료되었지만 집계의 지원 기능의 책임입니다. 일반적인 구현 접근법은 A에 대한 참조를 유지하는 것입니다."Tuplesort"객체 집계의 상태 값에서 들어오는 행을 해당 객체에 공급 한 다음 정렬을 완료하고 최종 기능에서 데이터를 읽습니다. 이 디자인은 최종 기능이 추가 주입과 같은 특수 작업을 수행 할 수 있도록합니다."가상"정렬 할 데이터로 줄을 세우십시오. 정상 집계는 종종에 작성된 지원 기능으로 구현 될 수 있습니다.pl/pgsql또는 다른 PL 언어, 순서 세트 집계는 일반적으로 SQL 데이터 유형으로 정의 할 수 없기 때문에 일반적으로 C로 작성해야합니다. (위의 예에서는 주 값이 유형으로 선언된다는 점에 주목하십시오.내부- 이것은 일반적입니다.)

순서 세트 집계의 상태 전환 함수는 현재 상태 값과 각 행의 집계 입력 값을 수신하고 업데이트 된 상태 값을 반환합니다. 이것은 정상 집계와 동일한 정의이지만 직접 인수 (있는 경우)는 제공되지 않습니다. 최종 함수는 마지막 상태 값, 직접 인수의 값이있는 경우 (if를받습니다.FinalFunc_extra지정됨) 무지개 토토 된 입력에 해당하는 널 값이 지정되어 있습니다. 정상 무지개 토토와 마찬가지로FinalFunc_extra집계가 다형성 인 경우에만 유용합니다. 그런 다음 최종 기능의 결과 유형을 집계의 입력 유형에 연결하려면 여분의 더미 인수가 필요합니다.

현재, 순서 세트 집계는 창 함수로 사용할 수 없으므로 이동 응집 모드를 지원할 필요가 없습니다.

35.10.4. 응집체에 대한 지원 기능

C로 작성된 함수는 호출하여 집계 전환 또는 최종 함수로 호출되는 것을 감지 할 수 있습니다aggcheckcallcontext, 예 :

if (aggcheckcallcontext (fcinfo, null))

이 점검의 한 가지 이유는 전환 함수에 맞을 때 첫 번째 입력이 임시 상태 값이어야하므로 새 사본을 할당하기보다는 안전하게 수정 될 수 있기 때문입니다. 보다int8inc ()예를 들어. (이것은입니다.전용기능이 패스 바로 회의 입력을 수정하는 것이 안전한 경우. 특히, 일반 골재에 대한 최종 함수는 어떤 경우에도 입력을 수정해서는 안됩니다. 어떤 경우에는 동일한 최종 상태 값에 다시 실행되기 때문에)

두 번째 인수aggcheckcallcontext집계 상태 값이 유지되는 메모리 컨텍스트를 검색하는 데 사용될 수 있습니다. 이것은 사용하려는 전환 기능에 유용합니다"확장"개체 (참조섹션 35.11.1) 주 값으로. 첫 번째 호출에서 전환 함수는 메모리 컨텍스트가 집계 상태 컨텍스트의 자식 인 확장 된 객체를 반환 한 다음 후속 통화에서 동일한 확장 된 객체를 계속 반환해야합니다. 보다array_append ()예를 들어. (array_append ()내장 골재의 전환 기능은 아니지만 사용자 지정 집계의 전환 기능으로 사용될 때 효율적으로 작동하도록 작성되었습니다.).

C로 작성된 무지개 토토 함수에 사용할 수있는 다른 지원 루틴agggetaggrefaggref무지개 토토 호출을 정의하는 구문 분석 노드. 이것은 주로 정렬 세트 골재에 유용하며의 하위 구조를 검사 할 수 있습니다.aggref노드를 구현 해야하는 정렬 주문을 찾으십시오. 예제는에서 찾을 수 있습니다.OrderedSetAggs.cinPostgreSQL소스 코드.