PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Fonction d'agrégation personnalisée

Vous affichez un calcul médian, mais vous voulez la première valeur textuelle que vous voyez ?

Vous trouverez ci-dessous comment procéder. En supposant que vous vouliez la première valeur non nulle, c'est-à-dire. Si ce n'est pas le cas, vous devrez vérifier si vous avez déjà une valeur ou non.

La fonction d'accumulateur est écrite comme plpgsql et sql - celle de plpgsql vous permet d'utiliser des noms de variables et de la déboguer également. Il utilise simplement COALESCE par rapport à la valeur cumulée précédente et à la nouvelle valeur et renvoie la première valeur non nulle. Donc - dès que vous avez un non-null dans l'accumulateur, tout le reste est ignoré.

Vous pouvez également envisager la fonction de fenêtre "first_value" pour ce genre de chose si vous utilisez une version moderne (8.4+) de PostgreSQL.

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