sql >> Databasteknik >  >> RDS >> PostgreSQL

Anpassad aggregatfunktion

Du visar en medianberäkning, men vill ha det första textvärdet du ser?

Nedan är hur du gör det. Förutsatt att du vill ha det första icke-nullvärdet, det vill säga. Om inte, måste du hålla reda på om du redan har ett värde eller inte.

Ackumulatorfunktionen skrivs som plpgsql och sql - plpgsql-funktionen låter dig använda variabelnamn och felsöka den också. Den använder helt enkelt COALESCE mot det tidigare ackumulerade värdet och det nya värdet och returnerar det första icke-nullvärdet. Så - så fort du har en icke-null i ackumulatorn ignoreras allt annat.

Du kanske också vill överväga fönsterfunktionen "first_value" för den här typen av saker om du använder en modern (8.4+) version av 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;



  1. F# Nybörjare:hämta en mängd data från en server

  2. Räkna maximala gånger som posten visas i databastabellen

  3. Ej butik uppdateradAt med uppföljningsmodell

  4. execSQL:är bindargs bättre?