| 롤 토토 : 문서 : 9.5 : 롤 토토 | |||
|---|---|---|---|
| PostgreSQL : 문서 : 9.5 : C- 언어 윈 토토 | Postgre윈 토토 : 문서 : 9.5 : 윈 토토 확장 | 35장. 확장SQL | 다음 |
무지개 토토 함수PostgreSQL다음으로 정의됩니다상태 값그리고상태 전환 함수. 즉, 집계는 각 연속 입력 행이 처리될 때 업데이트되는 상태 값을 사용하여 작동합니다. 새로운 무지개 토토 함수를 정의하려면 상태 값의 데이터 유형, 상태의 초기 값 및 상태 전이 함수를 선택합니다. 상태 전환 함수는 이전 상태 값과 현재 행에 대한 집계의 입력 값을 사용하고 새 상태 값을 반환합니다. 갑최종 기능또한 원하는 집계 결과가 실행 상태 값에 유지되어야 하는 데이터와 다른 경우에도 지정할 수 있습니다. 최종 함수는 마지막 상태 값을 사용하여 원하는 모든 것을 집계 결과로 반환합니다. 원칙적으로 전환 및 최종 함수는 집계 컨텍스트 외부에서도 사용할 수 있는 일반 함수일 뿐입니다. (실제로는 집계의 일부로 호출될 때만 작동할 수 있는 특수한 전환 함수를 만드는 것이 성능상의 이유로 도움이 되는 경우가 많습니다.)
따라서 집계 사용자에게 표시되는 인수 및 결과 데이터 유형 외에도 인수 및 결과 유형과 다를 수 있는 내부 상태 값 데이터 유형이 있습니다.
최종 함수를 사용하지 않는 무지개 토토를 정의하는 경우 각 행의 열 값에 대한 실행 함수를 계산하는 무지개 토토가 있습니다.합계이러한 무지개 토토의 예입니다.합0에서 시작하여 항상 현재 행의 값을 누계에 추가합니다. 예를 들어, 다음을 만들고 싶다면합계복소수에 대한 데이터 유형에 대해 작업하려면 해당 데이터 유형에 대한 덧셈 함수만 필요합니다. 집계 정의는 다음과 같습니다.
CREATE AGGREGATE 합계(복합)
(
sfunc = complex_add,
유형 = 복합,
initcond = '(0,0)'
);
다음과 같이 사용할 수 있습니다:
test_complex에서 SELECT sum(a); 합계 ----------- (34,53.9)
(우리는 함수 오버로드에 의존하고 있습니다. 명명된 무지개 토토가 두 개 이상 있습니다.합계하지만PostgreSQL어떤 종류의 합계가 유형의 열에 적용되는지 알아낼 수 있습니다.복잡한.)
위의 정의합null이 아닌 입력 값이 없으면 0(초기 상태 값)을 반환합니다. 아마도 우리는 이 경우 대신 null을 반환하고 싶을 것입니다. SQL 표준에서는 다음과 같이 예상합니다.합계그렇게 행동해요. 간단히를 생략하여 이 작업을 수행할 수 있습니다.initcond문구이므로 초기 상태 값은 null입니다. 일반적으로 이는 다음을 의미합니다.sfunc널 상태 값 입력을 확인해야 합니다. 하지만합계그리고 다음과 같은 기타 간단한 집계최대그리고분, null이 아닌 첫 번째 입력 값을 상태 변수에 삽입한 다음 null이 아닌 두 번째 입력 값에서 전환 함수 적용을 시작하면 충분합니다.PostgreSQL초기 상태 값이 null이고 전환 함수가 표시되면 자동으로 수행됩니다."엄격"(즉, null 입력에 대해 호출되지 않음).
a에 대한 또 다른 기본 동작"엄격함"전환 함수는 null 입력 값이 발생할 때마다 이전 상태 값이 변경되지 않고 유지된다는 것입니다. 따라서 null 값은 무시됩니다. null 입력에 대해 다른 동작이 필요한 경우 전환 함수를 엄격하게 선언하지 마세요. 대신 null 입력을 테스트하고 필요한 모든 작업을 수행하도록 코딩하세요.
평균(평균)은 집계의 더 복잡한 예입니다. 여기에는 입력 합계와 입력 개수의 두 가지 실행 상태가 필요합니다. 최종 결과는 이러한 수량을 나누어 얻습니다. 평균은 일반적으로 배열을 상태 값으로 사용하여 구현됩니다. 예를 들어, 다음의 내장 구현은평균(float8)다음과 같습니다:
총 평균 생성(float8)
(
sfunc = float8_accum,
유형 = float8[],
최종 기능 = float8_avg,
initcond = '0,0,0'
);
참고:
float8_accum은 2개의 요소가 아닌 3개의 요소로 구성된 배열이 필요합니다. 왜냐하면 입력의 합과 개수뿐만 아니라 제곱의 합도 누적하기 때문입니다. 이는 다른 무지개 토토에도 사용할 수 있도록 하기 위한 것입니다.평균.
SQL의 무지개 토토 함수 호출 허용독특그리고주문 기준집계의 전환 함수에 어떤 행이 어떤 순서로 제공되는지 제어하는 옵션입니다. 이러한 옵션은 배후에서 구현되며 집합체의 지원 기능과 관련이 없습니다.
자세한 내용은 다음을 참조하세요.PostgreSQL : 문서 : 9.5 : 스포츠 토토 사이트 생성명령.
무지개 토토 함수는 선택적으로 지원할 수 있음이동-무지개 토토 모드, 프레임 시작점이 이동하는 창 내에서 무지개 토토 함수를 훨씬 더 빠르게 실행할 수 있습니다. (참조4800 |6000 사설 토토0 |4800 |6000 사설 토토0 |6000 사설 토토0 |_4800 |6000 사설 토토0 |6000 사설 토토0 |4800 |500 사설 토토0 |4800 |6000 사설 토토0 |6000 사설 토토0 |4800 |4800 |500 사설 토토0 사설 토토0 사설 토토0 |6그리고섹션 4.2.8무지개 토토 함수를 창 함수로 사용하는 방법에 대한 정보.) 기본 아이디어는 일반적인"앞으로"전환 함수, 집계는 다음을 제공합니다.역전환 함수- 창 프레임을 종료할 때 집계의 실행 상태 값에서 행을 제거할 수 있습니다. 예를 들어합계16721_17199
The inverse transition function is passed the current state value and the aggregate input value(s) for the earliest row included in the current state. 주어진 입력 행이 집계된 적이 없고 그 뒤에 오는 행만 집계된 경우 상태 값이 무엇이었을지 재구성해야 합니다. 이를 위해서는 때때로 순방향 전환 기능이 일반 집계 모드에 필요한 것보다 더 많은 상태를 유지해야 합니다. Therefore, the moving-aggregate mode uses a completely separate implementation from the plain mode: it has its own state data type, its own forward transition function, and its own final function if needed. 추가 상태가 필요하지 않은 경우 일반 모드의 데이터 유형 및 기능과 동일할 수 있습니다.
예를 들어, 우리는 다음을 확장할 수 있습니다.합계다음과 같은 이동 집계 모드를 지원하기 위해 위에 제공된 집계:
CREATE AGGREGATE 합계(복합)
(
sfunc = complex_add,
유형 = 복합,
initcond = '(0,0)',
msfunc = complex_add,
minvfunc = complex_sub,
mstype = 복합,
minitcond = '(0,0)'
);
이름이 다음으로 시작하는 매개변수m이동 무지개 토토 구현을 정의합니다. 역전이 함수 제외minvfunc, 이는가 없는 일반 무지개 토토 매개변수에 해당합니다.m.
이동 집계 모드의 순방향 전환 기능은 새 상태 값으로 null을 반환하는 것이 허용되지 않습니다. 역전이 함수가 null을 반환하는 경우 이는 역함수가 이 특정 입력에 대한 상태 계산을 되돌릴 수 없다는 표시로 간주되므로 현재 프레임 시작 위치에 대한 집계 계산이 처음부터 다시 실행됩니다. 이 규칙을 사용하면 실행 상태 값을 되돌릴 수 없는 드문 경우가 있는 상황에서 이동 집계 모드를 사용할 수 있습니다. 역전이 함수는 다음과 같습니다."펀트"이러한 경우에 대해서는 대부분의 경우에 작동할 수 있는 한 여전히 앞서 나갈 수 있습니다. 예를 들어, 부동 소수점 숫자로 작업하는 집계는 다음과 같은 경우 펀트를 선택할 수 있습니다.NaN(숫자 아님) 입력이 실행 상태 값에서 제거되어야 합니다.
이동 집계 지원 함수를 작성할 때 역전이 함수가 올바른 상태 값을 정확하게 재구성할 수 있는지 확인하는 것이 중요합니다. 그렇지 않으면 이동 집계 모드 사용 여부에 따라 사용자가 볼 수 있는 결과의 차이가 있을 수 있습니다. 처음에는 역전이 함수를 추가하는 것이 쉬워 보이지만 이 요구 사항을 충족할 수 없는 집계의 예는 다음과 같습니다.합끝float4또는float8입력. 순진한 선언합계(float8)아마도
집계 unsafe_sum 생성(float8)
(
유형 = float8,
sfunc = float8pl,
mstype = float8,
msfunc = float8pl,
minvfunc = float8mi
);
그러나 이 집계는 역전이 기능이 없을 때와는 매우 다른 결과를 제공할 수 있습니다. 예를 들어 다음을 고려하세요.
선택
unsafe_sum(x) OVER (현재 행과 다음 1행 사이의 n 행 순서)
FROM(값(1, 1.0e20::float8),
(2, 1.0::float8)) AS v (n,x);
이 쿼리는 다음을 반환합니다.0다음의 예상 답변이 아닌 두 번째 결과로1. 원인은 부동 소수점 값의 정밀도가 제한되어 있기 때문입니다. 추가1에1e20결과는1e20다시, 그리고 빼기1e20그 결과0, 아님1. 이는 일반적으로 부동 소수점 연산의 제한 사항이지 다음의 제한 사항이 아닙니다.포스트그레SQL.
무지개 토토 함수는 다형성 상태 전환 함수 또는 최종 함수를 사용할 수 있으므로 동일한 함수를 사용하여 여러 집계를 구현할 수 있습니다. 보다섹션 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로 작성되고 상태 유형이 다음과 같이 선언되어야 하는 경우입니다.내부왜냐하면 그에 상응하는 SQL 수준이 없기 때문입니다. 이 경우를 해결하기 위해 최종 함수를 extra를 취하는 것으로 선언할 수 있습니다."더미"집합의 입력 인수와 일치하는 인수. 최종 함수가 호출될 때 특정 값을 사용할 수 없으므로 이러한 더미 인수는 항상 null 값으로 전달됩니다. 유일한 용도는 다형성 최종 함수의 결과 유형이 집계의 입력 유형에 연결되도록 허용하는 것입니다. 예를 들어 내장 집계의 정의는 다음과 같습니다.array_agg다음과 동일함
CREATE FUNCTION array_agg_transfn(내부, anynonarray)
내부 반환 ...;
함수 생성 array_agg_finalfn(내부, anynonarray)
모든 배열을 반환합니다 ...;
CREATE AGGREGATE array_agg (anynonarray)
(
sfunc = array_agg_transfn,
유형 = 내부,
finalfunc = array_agg_finalfn,
finalfunc_extra
);
여기는finalfunc_extra옵션은 최종 함수가 상태 값 외에도 집계의 입력 인수에 해당하는 추가 더미 인수를 수신하도록 지정합니다. 추가anynonarray인수는 다음의 선언을 허용합니다.array_agg_finalfn유효합니다.
무지개 토토 함수는 마지막 인수를 다음과 같이 선언하여 다양한 수의 인수를 허용하도록 만들 수 있습니다.VARIADIC배열, 일반 함수와 거의 같은 방식으로; 참조섹션 35.4.5. 무지개 토토의 전이 함수는 마지막 인수와 동일한 배열 유형을 가져야 합니다. 일반적으로 전환 함수도 표시됩니다.VARIADIC, 그러나 이는 반드시 필요한 것은 아닙니다.
참고:Variadic 집계는 다음과 관련하여 쉽게 오용됩니다.주문 기준옵션(참조섹션 4.2.7), 파서는 이러한 조합에 잘못된 개수의 실제 인수가 제공되었는지 여부를 알 수 없기 때문입니다. 의 오른쪽에 있는 모든 항목은주문 기준은 무지개 토토에 대한 인수가 아닌 정렬 키입니다. 예를 들어,
SELECT myaggregate(a ORDER BY a, b, c) FROM ...파서는 이것을 단일 무지개 토토 함수 인수와 세 개의 정렬 키로 간주합니다. 그러나 사용자가 의도했을 수도 있습니다.
SELECT myaggregate(a, b, c ORDER BY a) FROM ...만약myaggregate가변적이므로 이 두 호출 모두 완벽하게 유효할 수 있습니다.
같은 이유로 동일한 이름과 다른 개수의 일반 인수를 사용하여 무지개 토토 함수를 생성하기 전에 다시 한 번 생각하는 것이 현명합니다.
지금까지 우리가 설명한 집계는 다음과 같습니다."정상"무지개 토토.PostgreSQL또한 지원합니다순서 집합 무지개 토토는 두 가지 주요 측면에서 일반 집계와 다릅니다. 첫째, 입력 행당 한 번씩 평가되는 일반 집계 인수 외에도 순서 집합 무지개 토토는 다음을 가질 수 있습니다."직접"집계 작업당 한 번만 평가되는 인수입니다. 둘째, 일반 집계 인수의 구문은 해당 인수에 대한 정렬 순서를 명시적으로 지정합니다. 순서 집합 무지개 토토는 일반적으로 특정 행 순서(예: 순위 또는 백분위수)에 따라 계산을 구현하는 데 사용되므로 정렬 순서는 모든 호출의 필수 측면입니다. 예를 들어, 다음과 같은 내장 정의가 있습니다.백분위수_디스크다음과 같습니다:
CREATE FUNCTION order_set_transition(내부, 모든 요소)
내부 반환 ...;
함수 생성 백분위수_disc_final(내부, float8, 모든 요소)
모든 요소를 반환합니다 ...;
CREATE AGGREGATE 백분위수_디스크(float8 ORDER BY 모든 요소)
(
sfunc = 주문_세트_전환,
유형 = 내부,
finalfunc = 백분위수_디스크_최종,
finalfunc_extra
);
이 집계에는 다음이 소요됩니다.float8직접 인수(백분위수 분수) 및 정렬 가능한 모든 데이터 유형이 될 수 있는 집계된 입력입니다. 다음과 같이 중간 가계 소득을 구하는 데 사용될 수 있습니다.
가계에서 그룹 내(소득 기준 순서) 백분위수_디스크(0.5)를 선택합니다.
백분위수_디스크
-----------------
50489
여기,0.5은 직접적인 인수입니다. 백분위수 비율이 행에 따라 달라지는 값인 것은 의미가 없습니다.
일반 집계의 경우와 달리 순서 집합 무지개 토토의 입력 행 정렬은 다음과 같습니다.아님은밀히 수행되지만 집계 지원 기능의 책임입니다. 일반적인 구현 접근 방식은 a에 대한 참조를 유지하는 것입니다."튜플정렬"객체를 집계의 상태 값에 추가하고, 들어오는 행을 해당 객체에 공급한 다음 정렬을 완료하고 최종 함수에서 데이터를 읽습니다. 이 설계를 통해 최종 함수는 추가 주입과 같은 특수 작업을 수행할 수 있습니다."가설적"행을 정렬할 데이터에 추가합니다. 일반 집계는 종종 다음으로 작성된 지원 함수로 구현될 수 있습니다.PL/pgSQL또는 다른 PL 언어인 순서 집합 무지개 토토는 일반적으로 상태 값을 SQL 데이터 유형으로 정의할 수 없기 때문에 C로 작성해야 합니다. (위의 예에서는 state 값이 type으로 선언되어 있음에 유의하세요.내부— 이것이 일반적입니다.)
순서 집합 무지개 토토에 대한 상태 전환 함수는 현재 상태 값과 각 행의 집계된 입력 값을 수신하고 업데이트된 상태 값을 반환합니다. 이는 일반 집계의 정의와 동일하지만 직접 인수(있는 경우)가 제공되지 않습니다. 최종 함수는 마지막 상태 값, 직접 인수 값(있는 경우) 및 (iffinalfunc_extra이 지정됨) 무지개 토토된 입력에 해당하는 null 값입니다. 일반 무지개 토토와 마찬가지로,finalfunc_extra집계가 다형성인 경우에만 정말 유용합니다. 그런 다음 최종 함수의 결과 유형을 집계의 입력 유형에 연결하려면 추가 더미 인수가 필요합니다.
현재 순서 집합 무지개 토토는 창 함수로 사용할 수 없으므로 이동 집계 모드를 지원할 필요가 없습니다.
C로 작성된 함수는 다음을 호출하여 집계 전환 또는 최종 함수로 호출되고 있음을 감지할 수 있습니다.AggCheckCallContext, 예:
if (AggCheckCallContext(fcinfo, NULL))
이를 확인하는 한 가지 이유는 전환 함수에 대해 true인 경우 첫 번째 입력은 임시 상태 값이어야 하며 따라서 새 복사본을 할당하는 대신 안전하게 내부에서 수정할 수 있다는 것입니다. 참조int8inc()예를 들어. (이것은만함수가 참조별 입력을 수정하는 것이 안전한 경우. 특히 일반 집계에 대한 최종 함수는 어떤 경우에도 동일한 최종 상태 값에서 다시 실행되기 때문에 입력을 수정해서는 안 됩니다.)
다음의 두 번째 인수AggCheckCallContext집계 상태 값이 유지되는 메모리 컨텍스트를 검색하는 데 사용할 수 있습니다. 이는 다음을 사용하려는 전환 함수에 유용합니다."확장됨"객체(참조섹션 35.11.1)를 상태 값으로 사용합니다. 첫 번째 호출에서 전환 함수는 메모리 컨텍스트가 집계 상태 컨텍스트의 하위인 확장된 개체를 반환해야 하며, 이후 호출에서는 동일한 확장된 개체를 계속 반환해야 합니다. 참조array_append()예를 들어. (array_append()은 내장 집계의 전환 함수는 아니지만 사용자 정의 집계의 전환 함수로 사용될 때 효율적으로 작동하도록 작성되었습니다.)
C로 작성된 함수를 집계하는 데 사용할 수 있는 또 다른 지원 루틴은AggGetAggref, 이는를 반환합니다.Aggref집계 호출을 정의하는 구문 분석 노드입니다. 이는 주로 순서 집합 무지개 토토에 유용하며, 이는 다음의 하위 구조를 검사할 수 있습니다.Aggref노드를 사용하여 어떤 정렬 순서를 구현해야 하는지 알아보세요. 예는 다음에서 찾을 수 있습니다.orderedsetaggs.c에서PostgreSQL소스 코드.