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

Funzione di aggregazione personalizzata

Stai mostrando un calcolo mediano, ma vuoi il primo valore di testo che vedi?

Di seguito è riportato come farlo. Supponendo che tu voglia il primo valore non nullo, cioè. In caso contrario, dovrai tenere traccia se hai già un valore o meno.

La funzione accumulator è scritta come plpgsql e sql:quella plpgsql ti consente di utilizzare i nomi delle variabili e di eseguirne il debug. Usa semplicemente COALESCE rispetto al valore accumulato precedente e al nuovo valore e restituisce il primo non nullo. Quindi, non appena hai un valore non nullo nell'accumulatore, tutto il resto viene ignorato.

Potresti anche prendere in considerazione la funzione della finestra "first_value" per questo genere di cose se utilizzi una versione moderna (8.4+) di PostgreSQL.

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