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 по дате отправления: