2012-04-19 5 views
1
도 평균 방향이됩니다

내가 포스트 그레스의 사용자 정의 집계 함수를 구현하기 위해 노력하고있어 - 즉, 내가 할 수 원하는 :이 수식을 사용하여 수행 할 수 있습니다사용자 정의 PostgreSQL의 집계 원형 평균

SELECT circavg(direction) FROM sometable; 

:

xbar = atan2(sum(sin(xi), sum(cos(xi))) 

나는 방향을 취할 것 sfunc를 정의하고, 두 축 압기에 그의 사인과 코사인을 추가 할 필요가 있다고 생각합니다. 마지막 함수는 두 요소를 다시 atan2를 사용하여 한 방향으로 변환합니다.

sfunc을 정의하는 방법을 알아낼 수 없으므로 현재 상태가 두 가지 구성 요소로 구성됩니다. (플로트, 플로트). 문서는 구체적인 예에 ​​대해 조금 부족하므로 도움을 주시면 감사하겠습니다.

+0

SO! 설명 된'circavg'는 하나의 매개 변수를 취하는 반면'xbar' 샘플에는 2 개의 매개 변수를 지정했습니다. 또한, 예에서 닫는 괄호를 놓친다. – vyegorov

+1

@vyegorov : xbar 예제에는 단 하나의 매개 변수 ('xi') 만 있습니다. 두 곳에서 사용됩니다. –

+0

첫 번째 타이머에 +1 해 좋은 질문입니다. –

답변

2

첫 번째 버전은 버그가있었습니다. 지금 고정 및 테스트 됨
내부적으로 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 행의 경우 몇 밀리 초입니다.)

+0

유망 해 보입니다. 그러나 집계 함수의 정의는 나에게 구문 오류를 제공합니다. '구문 오류시 또는 그 근처 "::"'. (Postgres 9.1.3을 실행 중입니다.) – samwise

+0

@samwise : 죄송합니다. 테스트 후 캐스트를 추가했습니다. 고정되어 이제 작동해야합니다. –

+0

위대한 - 그 작품. 내 첫 번째 질문에 대한 답변 주셔서 감사합니다. – samwise

0

PostgreSQL은 geometry types, POINT 세트를 제공합니다.
이 유형을 함수의 입력 매개 변수로 사용하십시오.

원하는 경우 custom type을 만들 수 있습니다.

관련 문제