PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Niestandardowa funkcja agregująca

Wyświetlasz obliczenie mediany, ale chcesz wyświetlić pierwszą wartość tekstową?

Poniżej znajduje się, jak to zrobić. Zakładając, że potrzebujesz pierwszej wartości innej niż null. Jeśli nie, musisz śledzić, czy masz już wartość, czy nie.

Funkcja akumulatora jest napisana jako plpgsql i sql - plpgsql pozwala używać nazw zmiennych i debugować je. Po prostu używa COALESCE w stosunku do poprzedniej skumulowanej wartości i nowej wartości i zwraca pierwszą wartość inną niż null. Tak więc - jak tylko w akumulatorze pojawi się wartość niezerowa, wszystko inne zostanie zignorowane.

Możesz również rozważyć funkcję okna "first_value" dla tego rodzaju rzeczy, jeśli korzystasz z nowoczesnej (8.4+) wersji 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. Jakie jest E przed napisem Postgres?

  2. aktualizacja tabeli po pewnym czasie w postgreSql

  3. Utrzymywanie postgresów całkowicie w pamięci

  4. Wydajność skanowania sterty bitmapowej

  5. niezakończone pole cytowania CSV w Postgresie