2015-01-27 4 views
0

В поисках агрегатной функции, которая возвращает п-й элемент коллекции я нашел следующее решение:Создание агрегатной функции не удается

CREATE OR REPLACE FUNCTION _final_nth(anyarray, integer) 
    RETURNS anyelement AS 
$BODY$ 
    SELECT a 
    FROM unnest($1) a 
    ORDER BY a 
    offset $2 
    LIMIT 1; 
$BODY$ 
LANGUAGE 'sql' IMMUTABLE; 

CREATE AGGREGATE nth(anyelement, integer) (
    SFUNC=array_append, 
    STYPE=anyarray, 
    FINALFUNC=_final_nth, 
    INITCOND='{}' 
); 

Создание функции отлично работает, но выполнение CREATE Совокупные производит следующее сообщение об ошибке:

ERROR: function array_append(anyarray, anyelement, integer) does not exist

Я не могу устранить эту ошибку.

+0

Я не могу сделать головы или хвосты этого вопроса. Вы говорите, что хотите n-й элемент коллекции, но что такое «коллекция» в PG? Если «коллекция» - это набор результатов, что не так с прямым «OFFSET' /' LIMIT », и если это массив, что не так с прямым« myarray [n] »? Зачем вам нужен агрегат? Кроме того, ошибка выглядит довольно очевидной для меня. PostgreSQL пытается передать текущее состояние плюс аргументы агрегата в 'SFUNC', и нет никакого массива' array_append', который принимает эти аргументы (и не имеет никакого смысла для этого). – jpmc26

ответ

1

Может быть, это поможет:

CREATE OR REPLACE FUNCTION _final_nth(anyarray, integer) 
    RETURNS anyelement AS 
$BODY$ 
    SELECT a 
    FROM unnest($1) a 
    ORDER BY a 
    offset $2 
    LIMIT 1; 
$BODY$ 

Используйте его без дополнительной агрегатного-функции.

SELECT _final_nth(array_agg(someelement),n) AS someelement 
FROM sometable 
GROUP BY someelement; 

n - смещение.

Смежные вопросы