sql >> Databáze >  >> RDS >> PostgreSQL

Vlastní agregační funkce

Zobrazujete výpočet mediánu, ale chcete první textovou hodnotu, kterou vidíte?

Níže je uveden postup, jak to provést. Za předpokladu, že chcete první nenulovou hodnotu, tzn. Pokud ne, budete muset sledovat, zda již hodnotu máte nebo ne.

Funkce akumulátoru je napsána jako plpgsql a sql - funkce plpgsql vám umožňuje používat názvy proměnných a také je ladit. Jednoduše použije COALESCE proti předchozí akumulované hodnotě a nové hodnotě a vrátí první nenulovou hodnotu. Takže - jakmile máte v akumulátoru non-null, vše ostatní bude ignorováno.

Můžete také zvážit funkci okna "first_value" pro tento druh věcí, pokud používáte moderní (8.4+) verzi 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. Jak generovat data testu DB

  2. Jak můžete zjistit, zda se používá balíček, procedura nebo funkce PL/SQL?

  3. mysql minuty až hodiny a minuty

  4. Nastavte trvalý globální parametr MySQL