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

32.10. 사용자 정의 젠 토토

젠 토토 함수포스트그레SQL다음과 같이 표현됩니다상태 값그리고상태 전환 기능. 즉, 집계는 다음과 같이 정의될 수 있습니다. 입력 항목이 바뀔 때마다 수정되는 상태 조건 처리됨. 새로운 젠 토토 함수를 정의하려면 데이터를 선택합니다. 상태 값의 유형, 상태의 초기 값 및 상태 전환 기능. 상태 전이 기능은 단지 컨텍스트 외부에서도 사용할 수 있는 일반 함수 집계의. 갑최종 기능할 수 있다 원하는 집계 결과가 다음과 같은 경우에도 지정됩니다. 실행 중에 보관해야 하는 데이터와 다릅니다. 상태 값.

따라서 표시된 인수 및 결과 데이터 유형 외에도 집계된 사용자에 의해 내부 상태 값 데이터가 있습니다. 인수와 결과가 모두 다를 수 있는 유형 유형.

최종 함수를 사용하지 않는 집계를 정의하면, 우리는 다음의 실행 함수를 계산하는 집계를 가지고 있습니다. 각 행의 열 값입니다.합계이다 이런 종류의 젠 토토의 예입니다.0에서 시작하여 항상 현재 값을 더합니다. 행의 값을 누적 합계로 계산합니다. 예를 들어, 우리가 만들고 싶다면 에합계데이터 작업을 위해 집계 복소수를 입력하려면 덧셈 함수만 필요합니다. 해당 데이터 유형. 집계 정의는 다음과 같습니다.

집합 complex_sum 생성(
    sfunc = complex_add,
    기본 유형 = 복합,
    유형 = 복합,
    initcond = '(0,0)'
);

SELECT complex_sum(a) FROM test_complex;

 complex_sum
-------------
 (34,53.9)

(실제로는 젠 토토 이름만 지정합니다.합계그리고 의지합니다PostgreSQL어떤 종류의 합계를 알아내기 위해 유형의 열에 적용하려면복잡한.)

위의 정의할 것이다 null이 아닌 경우 0(초기 상태 조건)을 반환합니다. 입력 값. 아마도 이 경우에는 null을 반환하고 싶을 수도 있습니다. — SQL 표준이 기대하는 것합계에 그렇게 행동하세요. 간단히를 생략하여 이 작업을 수행할 수 있습니다.initcond문구를 사용하여 초기 상태 조건이 null입니다. 일반적으로 이는 다음을 의미합니다.sfuncnull을 확인해야 합니다. 상태 조건 입력, 그러나 for합계그리고 다음과 같은 다른 간단한 집계최대그리고그건 null이 아닌 첫 번째 입력 값을 상태 변수를 선택한 다음 전환 기능을 적용하기 시작합니다. null이 아닌 두 번째 입력 값입니다.PostgreSQL다음과 같은 경우 자동으로 수행됩니다. 초기 조건이 null이고 전환 함수가 표시됨"엄격"(즉, 호출되지 않음) null 입력).

a에 대한 또 다른 기본 동작"엄격함"전환 기능은 이전 null 입력 값이 입력될 때마다 상태 값은 변경되지 않고 유지됩니다. 마주쳤다. 따라서 null 값은 무시됩니다. 필요한 경우 null 입력에 대한 다른 동작은 정의하지 마세요. 전환 함수를 엄격하게 적용하고 null을 테스트하도록 코딩합니다. 입력하고 필요한 모든 작업을 수행합니다.

평균(평균)은 더 복잡합니다. 집계의 예. 두 가지 실행 상태가 필요합니다. 입력의 합과 입력 개수의 개수입니다. 는 최종 결과는 이 양을 나누어서 얻습니다. 평균은 일반적으로 두 요소로 구성된 배열을 상태로 사용하여 구현됩니다. 가치. 예를 들어, 다음의 내장 구현은평균(float8)다음과 같습니다:

총 평균 생성(
    sfunc = float8_accum,
    기본 유형 = float8,
    유형 = float8[],
    최종 기능 = float8_avg,
    initcond = '0,0'
);

젠 토토 함수는 다형성 상태 전환을 사용할 수 있습니다. 함수 또는 최종 함수를 사용하여 동일한 함수를 사용할 수 있습니다. 여러 집계를 구현하는 데 사용됩니다. 참조섹션 32.2.5다형성 함수에 대한 설명입니다. 가다 한 단계 더 나아가 젠 토토 함수 자체를 다음과 같이 지정할 수 있습니다. 다형성 기본 유형과 상태 유형을 사용하여 단일 유형을 허용합니다. 여러 입력 데이터 유형에 제공되는 집계 정의입니다. 여기 다형성 집합체의 예입니다.

집합 array_accum 생성(
    sfunc = array_append,
    기본 유형 = 모든 요소,
    유형 = 모든 배열,
    initcond = ''
);

여기서 집계 호출의 실제 상태 유형은 다음과 같습니다. 실제 입력 유형을 요소로 갖는 배열 유형입니다.

다음은 두 가지 서로 다른 실제 데이터 유형을 사용한 출력입니다. 인수:

SELECT attrelid::regclass, array_accum(attname)
    pg_attribute에서
    attnum  0 AND attrelid = 'pg_tablespace'::regclass가 있는 곳
    GROUP BY 아트렐리드;

   아트렐리드 |              array_accum              
-------------+----------------------------
 pg_테이블스페이스 | spcname,spcowner,spclocation,spcacl

C로 작성된 함수는 다음과 같이 호출되고 있음을 감지할 수 있습니다. 집계 전환 또는 최종 기능인지 확인하여 통과AggState노드를 함수 호출"컨텍스트", 예를 들어 으로

if (fcinfo-컨텍스트 && IsA(fcinfo-컨텍스트, AggState))

이것을 확인하는 한 가지 이유는 그것이 사실일 때 왼쪽 입력은 임시 전환 값이어야 하며 따라서 새 복사본을 할당하는 대신 안전하게 수정할 수 있습니다. (이것은사례 함수가 참조에 의한 전달을 수정하는 것이 안전한 경우 입력합니다.) 참조int8inc()에 대한 예.

자세한 내용은 다음을 참조하세요.집합 생성명령.