PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Fungsi agregat khusus

Anda menunjukkan penghitungan median, tetapi ingin nilai teks pertama yang Anda lihat?

Di bawah ini adalah cara melakukannya. Dengan asumsi Anda menginginkan nilai non-null pertama, yaitu. Jika tidak, Anda harus melacak apakah Anda sudah mendapatkan nilai atau belum.

Fungsi akumulator ditulis sebagai plpgsql dan sql - fungsi plpgsql memungkinkan Anda menggunakan nama variabel dan men-debugnya juga. Itu hanya menggunakan COALESCE terhadap nilai akumulasi sebelumnya dan nilai baru dan mengembalikan non-null pertama. Jadi - segera setelah Anda memiliki non-null di akumulator, semuanya akan diabaikan.

Anda mungkin juga ingin mempertimbangkan fungsi jendela "first_value" untuk hal semacam ini jika Anda menggunakan PostgreSQL versi modern (8.4+).

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. Panggil fungsi dengan tipe komposit sebagai argumen dari kueri asli di jpa

  2. Postgres:periksa apakah bidang array berisi nilai?

  3. Kesalahan saat mencoba menghubungkan R ke PostgreSQL menggunakan RODBC

  4. Kueri untuk menghitung nilai yang berbeda dalam rentang tanggal bergulir

  5. sarankan alat postgres untuk menemukan perbedaan antara skema dan data