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

41장. 확장SQL: 배트맨 토토

배트맨 토토 함수포스트그레다음과 같이 표현됩니다상태 값그리고상태 전환 함수. 즉, 집계는 수정된 상태의 관점에서 정의될 수 있습니다. 입력 항목이 처리될 때마다. 새 집계를 정의하려면 함수에서 상태 값에 대한 데이터 유형을 선택하고 초기 상태 값 및 상태 전환 기능. 주 전환 함수는 다음과 같은 일반적인 함수일 뿐입니다. 집계 컨텍스트 외부에서 사용됩니다.

사실, 유용한 구성을 더 쉽게 만들기 위해 기존 함수의 집계, 집계는 다음 중 하나를 가질 수 있습니다. 두 개의 개별 상태 값, 하나 또는 두 개의 전환 기능 해당 상태 값을 업데이트하고 a최종 기능이것은 실제 집계 결과를 계산합니다. 종료 상태 값.

따라서 최대 4개의 데이터 유형이 포함될 수 있습니다: 입력 데이터 항목의 집계 결과 유형 및 두 상태 값의 유형. 입력과 결과만 데이터 유형은 집계 사용자에게 표시됩니다.

일부 상태 전환 함수는 각각의 연속적인 상태를 확인해야 합니다. 다음 상태 값을 계산하기 위해 입력을 하고 다른 사람들은 이를 무시합니다. 특정 입력 값을 입력하고 내부 상태를 업데이트하기만 하면 됩니다. ( 두 번째 종류의 가장 유용한 예는 입력 항목 수입니다.) The포스트그레스배트맨 토토 기계 정의sfunc1함수로서의 집계용 이전 상태 값과 현재 입력이 모두 전달됩니다. 값, 동안sfunc2함수는 다음과 같습니다 이전 상태 값만 전달됩니다.

만 사용하는 배트맨 토토를 정의하는 경우sfunc1, 우리는 다음을 계산하는 집계를 가지고 있습니다. 각 인스턴스의 속성 값에 대한 함수를 실행합니다. "합" 이런 종류의 집계의 예입니다. "합계"는 0부터 시작하고 항상 현재 인스턴스의 값을 누계에 추가합니다. 에 대한 예를 들어, 데이터 유형에 대해 작동하도록 Sum 집계를 만들려는 경우 복소수의 경우 덧셈 함수만 필요합니다. 데이터 유형. 집계 정의는 다음과 같습니다.

집합 complex_sum 생성(
    sfunc1 = complex_add,
    기본 유형 = 복합,
    유형1 = 복합,
    initcond1 = '(0,0)'
);

SELECT complex_sum(a) FROM test_complex;

         +------------+
         |복합체_합 |
         +------------+
         |(34,53.9) |
         +------------+
(실제로는 집계 이름을 "sum"으로 지정하고 다음을 사용합니다.포스트그레어떤 종류인지 알아보기 위해 복잡한 열에 적용할 합계입니다.)

만 정의한다면sfunc2, 우리는 실행 중인 함수를 계산하는 배트맨 토토를 지정합니다. 각 인스턴스의 속성 값과 무관합니다. "카운트"는 이런 종류의 배트맨 토토의 가장 일반적인 예입니다. "카운트"가 시작됩니다 0에서 각 인스턴스의 누계에 1을 더합니다. 인스턴스 값을 무시합니다. 여기서는 내장을 사용합니다.int4inc우리를 위해 일을 하는 루틴입니다. 이 루틴은 인수를 증가(1을 추가)합니다.

집계 my_count 생성(
    sfunc2 = int4inc, -- 하나 추가
    기본 유형 = int4,
    stype2 = int4,
    initcond2 = '0'
);

EMP에서 emp_count로 my_count(*)를 선택합니다.

         +----------+
         |emp_count |
         +----------+
         |5 |
         +----------+

"평균"은 두 가지 모두가 필요한 집계의 예입니다. 누계를 계산하는 함수와 합계를 계산하는 함수 실행 횟수. 모든 인스턴스가 처리되면 집계에 대한 최종 답은 누계를 다음으로 나눈 값입니다. 실행 횟수. 우리는int4pl그리고int4inc우리가 이전에 사용했던 루틴 뿐만 아니라포스트그레정수 분할 루틴,int4div, 계산하다 합계를 개수로 나누는 것입니다.

집계 my_average 생성(
    sfunc1 = int4pl, -- 합계
    기본 유형 = int4,
    유형1 = int4,
    sfunc2 = int4inc, -- 개수
    stype2 = int4,
    finalfunc = int4div, -- 나누기
    initcond1 = '0',
    initcond2 = '0'
);

EMP에서 emp_average로 my_average(salary)를 선택합니다.

         +------------+
         |emp_평균 |
         +------------+
         |1640 |
         +------------+

자세한 내용은 참조배트맨 토토 생성inPostgreSQL 사용자 가이드.