Пользовательская агрегированная функция

Я пытаюсь понять совокупные функции, и мне нужна помощь.

Так, например, следующий образец:

CREATE OR REPLACE FUNCTION array_median(timestamp[]) RETURNS timestamp AS $$ SELECT CASE WHEN array_upper($1,1) = 0 THEN null ELSE asorted[ceiling(array_upper(asorted,1)/2.0)] END FROM (SELECT ARRAY(SELECT ($1)[n] FROM generate_series(1, array_upper($1, 1)) AS n WHERE ($1)[n] IS NOT NULL ORDER BY ($1)[n] ) As asorted) As foo ; $$ LANGUAGE 'sql' IMMUTABLE; CREATE AGGREGATE median(timestamp) ( SFUNC=array_append, STYPE=timestamp[], FINALFUNC=array_median ) 

Я не понимаю структуру / логику, которая должна войти в оператор select в самой агрегатной функции. Может ли кто-нибудь объяснить, что такое поток / логика?

Я пишу совокупность, странную, что возвращение всегда является первой строкой, которую она когда-либо видит.

Вы показываете медианный расчет, но хотите получить первое текстовое значение?

Ниже описано, как это сделать. Предполагая, что вы хотите получить первое ненулевое значение. Если нет, вам нужно будет отслеживать, есть ли у вас значение уже или нет.

Функция аккумулятора записывается как plpgsql и sql – plpgsql позволяет использовать имена переменных и отлаживать их. Он просто использует COALESCE против предыдущего накопленного значения и нового значения и возвращает первый ненулевой. Итак – как только у вас есть ненулевой в аккумуляторе, все остальное игнорируется.

Вы также можете рассмотреть функцию окна «first_value» для такого рода вещей, если вы используете современную (8.4+) версию PostgreSQL.

http://www.postgresql.org/docs/9.1/static/functions-window.html

НТН

 BEGIN; CREATE FUNCTION remember_first(acc text, newval text) RETURNS text AS $$ BEGIN RAISE NOTICE '% vs % = %', acc, newval, COALESCE(acc, newval); RETURN COALESCE(acc, newval); END; $$ LANGUAGE plpgsql IMMUTABLE; CREATE FUNCTION remember_first_sql(text,text) RETURNS text AS $$ SELECT COALESCE($1, $2); $$ LANGUAGE SQL IMMUTABLE; -- No "initcond" means we start out with null -- CREATE AGGREGATE first(text) ( sfunc = remember_first, stype = text ); CREATE TEMP TABLE tt (t text); INSERT INTO tt VALUES ('abc'),('def'),('ghi'); SELECT first(t) FROM tt; ROLLBACK;