PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Benutzerdefinierte Aggregatfunktion

Sie zeigen eine Medianberechnung an, möchten aber den ersten angezeigten Textwert?

Unten ist, wie das geht. Angenommen, Sie möchten den ersten Nicht-Null-Wert. Wenn nicht, müssen Sie nachverfolgen, ob Sie bereits einen Wert haben oder nicht.

Die Akkumulatorfunktion ist als plpgsql und sql geschrieben - die plpgsql-Funktion lässt Sie Variablennamen verwenden und auch debuggen. Es verwendet einfach COALESCE gegen den vorherigen akkumulierten Wert und den neuen Wert und gibt den ersten Nicht-Nullwert zurück. Also - sobald Sie eine Nicht-Null im Akkumulator haben, wird alles andere ignoriert.

Sie können auch die Fensterfunktion "first_value" für solche Dinge in Betracht ziehen, wenn Sie eine moderne (8.4+) Version von PostgreSQL verwenden.

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;