| PostgreSQL 9.3.25 문서 | ||||
|---|---|---|---|---|
| 토토 커뮤니티 : 문서 : 9.3 : 토토 커뮤니티whanguage functions | Postgre토토 사이트 추천 : 문서 : 9.3 : 토토 사이트 추천 확장 | 35장. 연장SQL | 다음 | |
토토 캔 함수포스트그레SQL다음으로 표현됩니다상태 값그리고상태 전환 기능. 즉, 집계는 다음을 사용하여 작동합니다. 각 연속 입력 행이 업데이트될 때 업데이트되는 상태 값은 다음과 같습니다. 처리됨. 새로운 토토 캔 함수를 정의하려면 데이터를 선택합니다. 상태 값의 유형, 상태의 초기 값 및 상태 전환 기능. 상태 전이 함수는 단지 컨텍스트 외부에서도 사용할 수 있는 일반 함수 집계. 갑최종 기능또한 가능 원하는 집계 결과가 다음과 같은 경우 지정되어야 합니다. 실행 상태로 유지해야 하는 데이터와 다름 값.
따라서 다음에서 볼 수 있는 인수 및 결과 데이터 유형 외에도 집계 사용자에는 내부 상태 값 데이터 유형이 있습니다. 주장과 결과가 다를 수 있음 유형.
최종 함수를 사용하지 않는 토토 캔를 정의하면
열의 실행 함수를 계산하는 토토 캔가 있습니다.
각 행의 값입니다.합계은
이러한 토토 캔의 예입니다.합0에서 시작하여 항상 현재 값을 더합니다.
행의 값을 누적 합계로 계산합니다. 예를 들어, 다음을 만들고 싶다면합계데이터 유형에 대한 작업을 위해 집계
복소수의 경우 덧셈 함수만 필요합니다.
데이터 유형. 집계 정의는 다음과 같습니다.
CREATE AGGREGATE 합계(복합)
(
sfunc = complex_add,
유형 = 복합,
initcond = '(0,0)'
);
SELECT sum(a) FROM test_complex;
합계
-----------
(34,53.9)
(우리는 함수 오버로딩에 의존하고 있음을 주목하세요:
둘 이상의 토토 캔 이름이 지정됨합계,
하지만PostgreSQL알아낼 수 있어요
유형의 열에 적용되는 합계의 종류복잡한.)
위의 정의합계할 것이다
null이 아닌 경우 0(초기 상태 조건)을 반환합니다.
입력 값. 아마도 우리는 그 대신에 null을 반환하고 싶을 것입니다.
SQL 표준에서는 다음과 같이 예상합니다.합계에
그렇게 행동하세요. 간단히를 생략하여 이 작업을 수행할 수 있습니다.initcond문구, 초기 상태 조건
null입니다. 일반적으로 이는 다음을 의미합니다.sfuncnull 상태 조건을 확인해야 합니다.
입력. 하지만합계및 기타
다음과 같은 간단한 집계최대그리고분, 다음을 삽입하면 충분합니다.
null이 아닌 첫 번째 입력 값을 상태 변수에 넣은 다음 시작합니다.
null이 아닌 두 번째 입력 값에 전환 함수를 적용합니다.PostgreSQL그러겠습니다
초기 조건이 null이고 전환이 발생하면 자동으로
기능이 표시됨"엄격"(즉, 아님
null 입력에 대해 호출됨).
a에 대한 또 다른 기본 동작"엄격"전환 기능은 이전 null 입력 값이 입력될 때마다 상태 값은 변경되지 않고 유지됩니다. 마주쳤다. 따라서 null 값은 무시됩니다. 다른 것이 필요하다면 null 입력에 대한 동작, 전환 함수를 선언하지 마세요 엄격하다; 대신 null 입력을 테스트하고 무엇이든 수행하도록 코딩합니다. 필요합니다.
평균(평균)은 더 복잡합니다.
집계의 예. 두 가지 실행 상태가 필요합니다.
입력의 합과 입력 개수의 개수입니다. 는
최종 결과는 이 양을 나누어서 얻습니다. 평균은
일반적으로 배열을 상태 값으로 사용하여 구현됩니다. 에 대한
예를 들어, 내장된 구현은평균(float8)다음과 같습니다:
총 평균 생성(float8)
(
sfunc = float8_accum,
유형 = float8[],
최종 기능 = float8_avg,
initcond = '0,0,0'
);
(float8_accum다음이 필요합니다.
요소가 두 개인 배열이 아니라 요소가 세 개인 배열입니다.
제곱의 합과 입력의 합 및 개수입니다. 이
그 외에 다른 집계에 사용할 수 있도록 하기 위한 것입니다.평균.)
토토 캔 함수는 다형성 상태 전환을 사용할 수 있습니다. 함수 또는 최종 함수를 사용하여 동일한 함수를 사용할 수 있습니다. 여러 집계를 구현하는 데 사용됩니다. 참조섹션 35.2.5다형성 함수에 대한 설명입니다. 가다 한 단계 더 나아가 토토 캔 함수 자체를 다음과 같이 지정할 수 있습니다. 다형성 입력 유형 및 상태 유형으로 단일 허용 여러 입력 데이터 유형에 제공되는 집계 정의입니다. 여기 다형성 집합체의 예입니다.
집합 array_accum 생성(모든 요소)
(
sfunc = array_append,
유형 = 모든 배열,
initcond = ''
);
여기서 토토 캔 호출의 실제 상태 유형은 배열입니다.
실제 입력 유형을 요소로 갖는 유형입니다. 의 행동
토토 캔는 모든 입력을 해당 배열로 연결하는 것입니다.
유형. (참고: 내장 토토 캔array_agg다음과 유사한 기능을 제공합니다.
이 정의보다 성능이 더 좋습니다.)
다음은 두 가지 서로 다른 실제 데이터 유형을 사용한 출력입니다. 인수:
SELECT attrelid::regclass, array_accum(attname)
pg_attribute에서
attnum 0 AND attrelid = 'pg_tablespace'::regclass가 있는 곳
GROUP BY 아트렐리드;
아트렐리드 | array_accum
-------------+----------------------------
pg_테이블스페이스 | spcname,spcowner,spcacl,scpoptions
C로 작성된 함수는 함수가 다음과 같이 호출되고 있음을 감지할 수 있습니다.
호출을 통해 집계 전환 또는 최종 함수AggCheckCallContext, 예:
if (AggCheckCallContext(fcinfo, NULL))
이것을 확인하는 한 가지 이유는 다음과 같습니다. 전환 함수, 첫 번째 입력은 임시 전환이어야 합니다. 값이 있으므로 대신 안전하게 수정할 수 있습니다. 새 복사본을 할당합니다. 참조int8inc()용 예. (이것은만안전한 경우 참조에 의한 전달 입력을 수정하는 함수입니다. 특히, 집계 최종 함수는 어떤 경우에도 입력을 수정해서는 안 됩니다. 어떤 경우에는 동일한 작업에서 다시 실행되기 때문입니다. 최종 전환 값.)
자세한 내용은 다음을 참조하세요.집합 생성명령.