첫 번째 버전은 버그가있었습니다. 지금 고정 및 테스트 됨
내부적으로 ARRAY 유형을 사용할 수 있습니다. 인수 유형은 여전히 모든 숫자 유형이 될 수 있습니다. 여기서는 float
(= double precision
)을 사용합니다.
은 다음과 같이 작동 할 수 :
CREATE TEMP TABLE t (x float);
INSERT INTO t VALUES (2), (3), (4), (5);
전화 :
SELECT circavg(x) FROM t;
circavg
-------------------
-2.78318530717959
크로스 체크 :
SELECT atan2(sum(sin(x)), sum(cos(x))) FROM t;
atan2
-------------------
-2.78318530717959
테스트
CREATE OR REPLACE FUNCTION f_circavg (float[], float)
RETURNS float[] AS
$body$
SELECT ARRAY[$1[1] + sin($2), $1[2] + cos($2)];
$body$ LANGUAGE sql;
CREATE OR REPLACE FUNCTION f_circavg_final (float[])
RETURNS float AS
$body$
SELECT atan2($1[1], $1[2]);
$body$ LANGUAGE sql;
CREATE AGGREGATE circavg (float)
(sfunc = f_circavg
,stype = float[]
,finalfunc = f_circavg_final
,initcond = '{0,0}'
);
임시 테이블
동일한 결과를 반환합니다. 지금 일하는 것 같습니다.
BTW : 일반 집계 함수를 사용한 마지막 표현식이 사용자 지정 집계보다 4 배 빨라진 큰 테이블에서 테스트합니다. (하지만 둘 다 빠르며 5000 행의 경우 몇 밀리 초입니다.)
SO! 설명 된'circavg'는 하나의 매개 변수를 취하는 반면'xbar' 샘플에는 2 개의 매개 변수를 지정했습니다. 또한, 예에서 닫는 괄호를 놓친다. – vyegorov
@vyegorov : xbar 예제에는 단 하나의 매개 변수 ('xi') 만 있습니다. 두 곳에서 사용됩니다. –
첫 번째 타이머에 +1 해 좋은 질문입니다. –