Re: creating a new aggregate function

Поиск
Список
Период
Сортировка
От David Johnston
Тема Re: creating a new aggregate function
Дата
Msg-id 1393868159887-5794419.post@n5.nabble.com
обсуждение исходный текст
Ответ на creating a new aggregate function  (Seb <spluque@gmail.com>)
Список pgsql-sql
Sebastian P. Luque wrote
> Hi,
> 
> I'm trying to implement an aggregate function to calculate the average
> angle from one or more angles and corresponding magnitudes.  So my first
> step is to design a function that decomposes the angles and magnitudes
> and returns the corresponding x and y vectors, and the following works
> does this:
> 
> ---<--------------------cut
> here---------------start------------------->---
> CREATE OR REPLACE FUNCTION decompose_angle(IN angle numeric, IN magnitude
> numeric,
>   OUT x numeric, OUT y numeric) RETURNS record AS
> $BODY$
> BEGIN
>     x := sin(radians(angle)) * magnitude;
>     y := cos(radians(angle)) * magnitude;
> END;
> $BODY$
>   LANGUAGE plpgsql STABLE
>   COST 100;
> ALTER FUNCTION decompose_angle(numeric, numeric)
>   OWNER TO sluque;
> COMMENT ON FUNCTION decompose_angle(numeric, numeric) IS
>   'Decompose an angle and magnitude into x and y vectors.';
> ---<--------------------cut
> here---------------end--------------------->---
> 
> Before moving on to writing the full aggregate, I'd appreciate any
> suggestions to understand how to go about writing an aggregate for the
> above, that would return the average x and y vectors.

I would suggest you design custom types that incorporate the
angle,magnitude-pair and the x,y-pair and write your functions to operate
using those types.

The documentation for CREATE AGGREGATE is fairly detailed and can be
summarized as:
1) Do something for each input row - you maintain state internally
2) Do something after the last row has been processed - using the state from
#1

http://www.postgresql.org/docs/9.3/interactive/sql-createaggregate.html

What you do in those two steps depends fully on the algorithm you need which
is beyond my immediate knowledge.

Note the use of plpgsql in your function is probably undesirable since you
are not actually using any procedural logic; an SQL language function is
better since it gives the system more optimization options.

David J.





--
View this message in context:
http://postgresql.1045698.n5.nabble.com/creating-a-new-aggregate-function-tp5794414p5794419.html
Sent from the PostgreSQL - sql mailing list archive at Nabble.com.



В списке pgsql-sql по дате отправления:

Предыдущее
От: Seb
Дата:
Сообщение: creating a new aggregate function
Следующее
От: Seb
Дата:
Сообщение: Re: creating a new aggregate function