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

37.12. 사용자 정의 골재

스포츠 토토 결과 함수postgresql의 관점에서 정의됩니다상태 값and상태 전환 기능. 즉, 골재는 각 연속 입력 행이 처리되면 업데이트되는 상태 값을 사용하여 작동합니다.최종 기능can also be specified, in case the desired result of the aggregate is different from the data that needs to be kept in the running state value. 최종 기능은 종료 상태 값을 취하고 원하는 모든 것을 집계 결과로 반환합니다.

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

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

스포츠 토토 결과 합계 생성 (복잡한)

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

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

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

위의 정의Sumunnull 입력 값이없는 경우 0 (초기 상태 값)을 반환합니다. 아마도 우리는 그 경우에 NULL을 반환하고 싶을 것입니다 - SQL 표준은 기대입니다.Sum그런 식으로 행동합니다. 우리는 단순히를 생략하여 이것을 할 수 있습니다.initcond문구, 초기 상태 값이 무일하게 이루어집니다. 일반적으로 이것은sfunc널 상태 가치 입력을 확인해야합니다. 하지만Sum그리고 다른 간단한 스포츠 토토 결과와 같은maxandMin, 첫 번째 Nonnull 입력 값을 상태 변수에 삽입 한 다음 두 번째 Nonnull 입력 값에서 전환 함수를 적용하기 시작하는 것으로 충분합니다..postgresql초기 상태 값이 NULL이고 전환 함수가 표시되면 자동으로 수행합니다엄격한(즉, 널 입력을 요구하지 않음).

A에 대한 또 다른 기본 동작엄격한전이 함수는 널 입력 값이 발생할 때마다 이전 상태 값이 변경되지 않다는 것입니다. 따라서 널 값은 무시됩니다.

avg(평균)는 집계의 더 복잡한 예입니다. 입력의 합과 입력 수의 수의 두 가지 런닝 상태가 필요합니다.avg (float8)모양 :

스포츠 토토 결과 AVG 생성 (float8)

Note

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

SQL에서의 스포츠 토토 결과 함수 호출별도의and주문집계의 전환 함수에 공급되는 행을 제어하는 ​​옵션. 이 옵션은 무대 뒤에서 구현되며 집계의 지원 기능의 관심사가 아닙니다.

자세한 내용은 참조하십시오.스포츠 토토 결과 생성명령.

37.12.1. 이동 모드 이동

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

역 전이 함수는 현재 상태에 포함 된 최초의 행에 대한 현재 상태 값과 집계 입력 값이 전달됩니다. 주어진 입력 행이 집계되지 않은 경우 상태 값이 무엇인지 재구성해야합니다.

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

스포츠 토토 결과 합계 생성 (복잡한)

이름이 시작되는 매개 변수m이동 응집 구현을 정의합니다. 역 전이 함수를 제외하고minvfuncm.

이동 응집 모드의 전방 전환 기능은 새로운 상태 값으로 NULL을 반환 할 수 없습니다. If the inverse transition function returns null, this is taken as an indication that the inverse function cannot reverse the state calculation for this particular input, and so the aggregate calculation will be redone from scratch for the current frame starting position.Punt이 경우에도 대부분의 경우 작동 할 수있는 한 여전히 앞서 나옵니다. 예를 들어, 부동 소수점 숫자로 작업하는 스포츠 토토 결과는 A를 펀트 할 수 있습니다.NAN(숫자가 아님) 입력을 실행중인 상태 값에서 제거해야합니다.

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

스포츠 토토 결과 생성 unsafe_sum (float8)

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

선택

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

37.12.2. 다형성 및 변수 응집체

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

스포츠 토토 결과 생성 array_accum (Anylement)

여기서, 주어진 스포츠 토토 결과 호출에 대한 실제 상태 유형은 실제 입력 유형을 요소로하는 배열 유형입니다. 골재의 동작은 모든 입력을 해당 유형의 배열로 연결하는 것입니다.array_agg이 정의보다 성능이 향상되는 유사한 기능을 제공합니다.)

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

attrelid :: regclass, array_accum (attname)

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

함수 생성 array_agg_transfn (내부, AnynonArray)

여기,FinalFunc_extra옵션은 상태 값 외에 최종 함수가 집계의 입력 인수에 해당하는 추가 더미 인수를 수신하도록 지정합니다. 추가AnynonArray인수는 선언을 허용합니다.array_agg_finalfn유효하려면.

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

Note

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

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

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

myaggregate (a, b, c ord by a) From 선택

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

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

37.12.3. 순서 대기업

지금까지 설명한 스포츠 토토 결과는정상스포츠 토토 결과.postgresql또한 지원주문 세트 골재, 이는 두 가지 주요 방식으로 정상 응집체와 다릅니다. 첫째, 입력 행 당 한 번 평가되는 일반적인 집계 인수 외에도 순서 세트 집계는 가질 수 있습니다Direct스포츠 토토 결과 작업 당 한 번만 평가되는 인수. 둘째, 일반적인 스포츠 토토 결과 된 인수에 대한 구문은 명시 적으로 정렬 순서를 지정합니다.백분석 _DISC:에 해당합니다.

함수 작성 ordered_set_transition (내부, Anylement)

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

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

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

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

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

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

37.12.4. 부분 스포츠 토토 결과

선택적으로 스포츠 토토 결과 함수가 지원할 수 있습니다부분 스포츠 토토 결과. 부분 스포츠 토토 결과에 대한 아이디어는 입력 데이터의 다른 서브 세트에 대해 골재의 상태 전이 함수를 독립적으로 실행 한 다음 해당 서브 세트로 인한 상태 값을 결합하여 단일 작업에서 모든 입력을 스캔하여 발생할 수있는 동일한 상태 값을 생성하는 것입니다.

부분 스포츠 토토 결과를 지원하려면 집계 정의가 a를 제공해야합니다.함수 결합, which takes two values of the aggregate's state type (representing the results of aggregating over two subsets of the input rows) and produces a new value of the state type, representing what the state would have been after aggregating over the combination of those sets of rows. 두 세트의 입력 행의 상대 순서가 무엇인지 지정하지 않습니다.

간단한 예로maxandMin조합 기능을 전환 함수로 사용하는 것과 동일한 두 가지 또는 두 가지 비교 기능으로 지정하여 부분 스포츠 토토 결과를 지원하기 위해 집계 할 수 있습니다..Sum집계는 결합 함수로 추가 함수가 필요합니다. (다시, 이것은 상태 값이 입력 데이터 유형보다 넓지 않는 한 전환 함수와 동일합니다.)

Combine 함수는 두 번째 인수로서 기본 입력 유형이 아닌 상태 유형의 값을 취하는 전이 함수와 매우 유사합니다. 특히, 널 값과 엄격한 함수를 다루기위한 규칙은 유사합니다.initcond, 이는 각 부분 스포츠 토토 결과 실행의 초기 상태뿐만 아니라 결합 함수의 초기 상태로도 사용될 것이며, 각 부분 결과를 해당 상태로 결합하도록 호출됩니다..

스포츠 토토 결과 상태 유형이로 선언 된 경우내부, 집계 상태 값에 대한 올바른 메모리 컨텍스트에 결과가 할당되는 것은 Combine 함수의 책임입니다. 이것은 특히 첫 번째 입력이있을 때를 의미합니다.NULL그 값이 잘못된 컨텍스트에 있고 충분한 수명을 가지지 않기 때문에 두 번째 입력을 단순히 반환하는 것이 유효하지 않습니다..

스포츠 토토 결과 상태 유형이로 선언 될 때내부직렬화 함수and a사막화 기능, 그러한 상태 값을 한 프로세스에서 다른 프로세스로 복사 할 수 있습니다. 이러한 기능이 없으면 병렬 집계를 수행 할 수 없으며 로컬/원격 집계와 같은 향후 응용 프로그램도 작동하지 않을 것입니다.

직렬화 함수는 유형의 단일 인수를 취해야합니다내부그리고 유형의 결과를 반환BYTEA는 바이트의 평평한 덩어리에 포장 된 상태 값을 나타냅니다. 반대로, 사막화 함수는 해당 변환을 역전시킵니다.BYTEAand내부, 그리고 유형의 결과를 반환내부. (두 번째 인수는 사용되지 않고 항상 0이지만 유형 안전한 이유로 필요합니다.) 사막화 함수의 결과는 Combine 함수의 결과와 달리 오래 지속되지 않으므로 현재 메모리 컨텍스트에 단순히 할당되어야합니다..

주목할만한 가치는 스포츠 토토 결과가 병렬로 실행 되려면 스포츠 토토 결과 자체가 표시되어야한다는 것입니다.Parallel Safe. 지원 기능의 평행 안전 표시는 상담되지 않습니다.

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

C로 작성된 함수는 호출하여 총 지원 함수로 호출되고 있음을 감지 할 수 있습니다aggcheckcallcontext, 예 :

if (aggcheckcallcontext (fcinfo, null))

이 점검의 한 가지 이유는 사실 일 때 첫 번째 입력이 임시 상태 값이어야하므로 새 사본을 할당하기보다는 안전하게 수정 될 수 있기 때문입니다. 보다int8inc ()예를 들어. (집계 전이 함수는 항상 전환 값을 현장에서 수정할 수 있지만, 집계 최종 기능은 일반적으로 그렇게하는 것을 권장하지 않습니다. 그렇게하면 집계를 만들 때 동작이 선언되어야합니다. 참조 참조 참조.스포츠 토토 결과 생성자세한 내용은)

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

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