집계 함수PostgreSQL상태 값and상태 전환 기능. 즉, 집계입니다 각 연속으로 업데이트되는 상태 값을 사용하여 작동합니다. 입력 행이 처리됩니다. 새로운 집계 함수를 정의하기 위해 상태 값의 데이터 유형을 선택합니다. 상태 및 상태 전환 기능. 상태 전환 기능은 사용될 수있는 일반적인 기능입니다. 집계의 맥락 외부. 에이최종 기능경우를 대비하여 지정할 수도 있습니다 집계의 원하는 결과는 실행중인 상태 가치를 유지해야합니다.
따라서 보이는 인수 및 결과 데이터 유형 외에 집계 토토 사이트가 내부 상태 가치 데이터가 있습니다. 인수와 결과와 다를 수있는 유형 유형.
최종 기능을 사용하지 않는 집계를 정의하면
우리는
각 행에서 열 값.Sum
IS
이런 종류의 집계의 예.Sum
0에서 시작하여 항상 전류를 추가합니다
Row의 가치가 달리는 총계. 예를 들어, 우리가 만들고 싶다면
에이Sum
데이터 작업을위한 집계
복소수에 대한 유형, 추가 기능 만 필요합니다.
해당 데이터 유형. 집계 정의는 다음과 같습니다.
집계 합계 생성 (복잡한) ( sfunc = complex_add, stype = complex, initcond = '(0,0)' ); test_complex에서 합 (a)를 선택하십시오. 합집합 ---------- (34,53.9)
(기능 과부하에 의존하고 있음을 알 수 있습니다.
하나 이상의 집계 이름Sum
,
하지만postgresql알아낼 수 있습니다
유형의 열에 적용되는 합계복잡한.)
위의 정의Sum
의지
unnull이없는 경우 return zero (초기 상태 조건)
입력 값. 아마도 우리는 그 경우에 null을 반환하고 싶을 것입니다.
- SQL 표준이 기대Sum
TO
그렇게 행동하십시오. 우리는 단순히를 생략하여 이것을 할 수 있습니다.initcond초기 상태가되도록 문구
상태는 무일합니다. 일반적으로 이것은sfuncnull을 확인해야합니다
상태 조건 입력. 하지만Sum
그리고 다른 간단한 집계와 같은max
andMin
, It
첫 번째 Nonnull 입력 값을
상태 변수를 다음에 전환 기능을 적용하기 시작합니다.
두 번째 비 연소 입력 값.PostgreSQL초기 조건은 널이고 전환 함수가 표시됩니다"엄격한"(즉, 요청되지 않아야합니다
널 입력).
A에 대한 또 다른 기본 동작"엄격한"전이 함수는 이전입니다 널 입력 값이있을 때마다 상태 값이 변경되지 않습니다. 만난. 따라서 널 값은 무시됩니다. 필요하다면 널 입력에 대한 기타 동작, 전환을 선언하지 마십시오. 엄격한 기능; 대신 널 입력을 테스트하기 위해 코딩하고 필요한 모든 것을하십시오.
avg
(평균)는 더 복잡합니다
집계의 예. 두 개의 러닝 상태가 필요합니다.
입력의 합 및 입력 수의 수. 그만큼
최종 결과는 이러한 수량을 나누어 얻습니다. 평균입니다
일반적으로 배열을 상태 값으로 사용하여 구현됩니다. 을 위한
예를 들어, 내장 구현avg (float8)
모양 :
집계 AVG 생성 (float8) ( sfunc = float8_accum, stype = float8 [], finalfunc = float8_avg, initcond = '0,0' );
(float8_accum
a
두 요소만이 아니라 3 요소 배열
제곱의 합과 합계와 수의 합계를 축적합니다.
입력. 이것은 다른 사람들에게 토토 사이트될 수 있도록
이외의 골재avg
.)
집계 함수는 다형성 상태 전이를 사용할 수 있습니다 동일한 함수가 될 수 있도록 함수 또는 최종 기능 여러 골재를 구현하는 데 사용됩니다. 보다섹션 34.2.5다형성 기능에 대한 설명. a 더 나아가서, 골재 기능 자체는 다음과 같이 지정할 수 있습니다. 다형성 입력 유형 및 상태 유형, 단일을 허용합니다 다중 입력 데이터 유형에 대한 서비스 정의. 여기 다형성 집계의 예입니다.
집계 생성 array_accum (Anylement) ( sfunc = array_append, stype = anyArray, initcond = '' );
여기서는 집계 호출의 실제 상태 유형은 다음과 같습니다. 실제 입력 유형을 요소로하는 배열 유형.
다음은 다음과 같은 두 가지 실제 데이터 유형을 사용하는 출력입니다. 인수 :
attrelid :: regclass, array_accum (attname) pg_attribute에서 여기서 attnum 0 및 attrelid = 'pg_tablespace':: regclass Attrelid에 의한 그룹; attrelid | Array_accum ---------------+------------------------------------------------ PG_TABLESPACE | spcname, spcowner, spclocation, spcacl
c로 작성된 함수는 그것이 다음과 같이 호출되는 것을 감지 할 수 있습니다. 집계 전이 또는 최종 기능이 통과aggstate노드로 함수 호출"Context"예를 들어 에 의해:
if (fcinfo- context && isa (fcinfo- context, aggstate))
이것을 확인하는 한 가지 이유는 그것이 사실 일 때 첫 번째 입력은 임시 전환 값이어야하며 따라서 할당하기보다는 안전하게 내장으로 수정됩니다 새 사본. (이것은입니다.전용a 통과 참조 입력을 수정하는 기능.) 참조int8inc ()예를 들어.
자세한 내용은 참조하십시오.집계 생성명령.