Re: creating a new aggregate function - Mailing list pgsql-sql

From David Johnston
Subject Re: creating a new aggregate function
Date
Msg-id 1393868159887-5794419.post@n5.nabble.com
Whole thread Raw
In response to creating a new aggregate function  (Seb <spluque@gmail.com>)
List 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 by date:

Previous
From: Seb
Date:
Subject: creating a new aggregate function
Next
From: Seb
Date:
Subject: Re: creating a new aggregate function