sql >> Database >  >> RDS >> PostgreSQL

Aangepaste aggregatiefunctie

U geeft een mediaanberekening weer, maar wilt u de eerste tekstwaarde die u ziet?

Hieronder leest u hoe u dat doet. Ervan uitgaande dat u de eerste niet-null-waarde wilt, dat wil zeggen. Zo niet, dan moet je bijhouden of je al een waarde hebt of niet.

De accumulatorfunctie is geschreven als plpgsql en sql - met de plpgsql-functie kun je variabelenamen gebruiken en deze ook debuggen. Het gebruikt gewoon COALESCE tegen de vorige geaccumuleerde waarde en de nieuwe waarde en retourneert de eerste niet-null. Dus - zodra je een niet-null in de accumulator hebt, wordt al het andere genegeerd.

U kunt ook de vensterfunctie "first_value" voor dit soort dingen overwegen als u een moderne (8.4+) versie van PostgreSQL gebruikt.

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. Hoe subcategorieën uit de geselecteerde categorie selecteren met behulp van een geneste functie in PHP?

  2. MySQL en Java:tabel bestaat niet

  3. Mysql drukt hulp af in plaats van verbinding te maken met de server

  4. MySQL:werk alle rijen in een tabel bij die overeenkomen met de resultaten van een andere zoekopdracht