PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Персонализирана агрегатна функция

Вие показвате средно изчисление, но искате първата текстова стойност, която виждате?

По-долу е описано как да направите това. Ако приемем, че искате първата ненулева стойност, т.е. Ако не, ще трябва да следите дали вече имате стойност или не.

Акумулаторната функция е написана като plpgsql и sql - plpgsql ви позволява да използвате имена на променливи и да ги дебъгвате. Той просто използва COALESCE срещу предишната натрупана стойност и новата стойност и връща първата ненулева стойност. Така че - веднага щом имате не-нула в акумулатора, всичко останало се игнорира.

Може също така да обмислите прозоречната функция "first_value" за подобни неща, ако използвате модерна (8.4+) версия на 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Запазване на времеви марки в Postgres въз основа на дати на Java

  2. Postgresql JSONB идва. Какво да използвам сега? Hstore? JSON? EAV?

  3. миграцията на django db е неуспешна с postgre

  4. Условна функция за извеждане/закъснение PostgreSQL?

  5. pg_restore не можа да изпълни заявка:ГРЕШКА:невалидно име на локал:en_US.UTF-8