sql >> Base de Datos >  >> RDS >> PostgreSQL

Función agregada personalizada

Estás mostrando un cálculo de la mediana, pero ¿quieres el primer valor de texto que ves?

A continuación se muestra cómo hacerlo. Suponiendo que desea el primer valor no nulo, es decir. De lo contrario, deberá realizar un seguimiento de si ya tiene un valor o no.

La función del acumulador está escrita como plpgsql y sql; la plpgsql le permite usar nombres de variables y depurarlos también. Simplemente usa COALESCE contra el valor acumulado anterior y el nuevo valor y devuelve el primer no nulo. Entonces, tan pronto como tenga un valor no nulo en el acumulador, todo lo demás se ignorará.

También puede considerar la función de ventana "first_value" para este tipo de cosas si tiene una versión moderna (8.4+) de PostgreSQL.

http://www.postgresql.org/docs/9.1/static /funciones-ventana.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;