PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Função agregada personalizada


Você está mostrando um cálculo de mediana, mas quer o primeiro valor de texto que vê?

Abaixo está como fazer isso. Supondo que você queira o primeiro valor não nulo, isto é. Caso contrário, você precisará acompanhar se já possui um valor ou não.

A função de acumulador é escrita como plpgsql e sql - a função plpgsql permite que você use nomes de variáveis ​​e depure também. Ele simplesmente usa COALESCE contra o valor acumulado anterior e o novo valor e retorna o primeiro não nulo. Então - assim que você tiver um não nulo no acumulador, todo o resto será ignorado.

Você também pode considerar a função de janela "first_value" para esse tipo de coisa se estiver em uma versão moderna (8.4+) do PostgreSQL.

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

HTH
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;