sql >> Database teknologi >  >> RDS >> PostgreSQL

Brugerdefineret aggregeret funktion

Du viser en medianberegning, men vil have den første tekstværdi, du ser?

Nedenfor er hvordan man gør det. Forudsat at du vil have den første ikke-nul værdi, dvs. Hvis ikke, skal du holde styr på, om du allerede har en værdi eller ej.

Akkumulatorfunktionen er skrevet som plpgsql og sql - plpgsql en lader dig bruge variabelnavne og også fejlsøge den. Den bruger simpelthen COALESCE mod den tidligere akkumulerede værdi og den nye værdi og returnerer den første ikke-nul. Så - så snart du har en ikke-nul i akkumulatoren bliver alt andet ignoreret.

Du kan også overveje vinduesfunktionen "first_value" til denne slags ting, hvis du bruger en moderne (8.4+) version af 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. FEJL:tilladelse nægtet til relationstabelnavn på Postgres, mens du prøvede en SELECT som skrivebeskyttet bruger

  2. MySQL - OG tilstand

  3. Returliste<String> ved hjælp af Spring jdbc fra Oracle-lagret procedure med brugerdefineret objekt

  4. Hvad er der galt med PDO-forbindelse?