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

Agregat PostgreSQL khusus untuk rata-rata melingkar

Anda dapat menggunakan ARRAY mengetik secara internal. Tipe argumen masih bisa berupa tipe numerik apa pun. Mendemonstrasikan dengan float (=double precision ):

CREATE OR REPLACE FUNCTION f_circavg (float[], float)
  RETURNS float[] LANGUAGE sql STRICT AS
'SELECT ARRAY[$1[1] + sin($2), $1[2] + cos($2), 1]';

CREATE OR REPLACE FUNCTION f_circavg_final (float[])
  RETURNS float  LANGUAGE sql AS
'SELECT CASE WHEN $1[3] > 0 THEN atan2($1[1], $1[2]) END';

CREATE AGGREGATE circavg (float) (
   sfunc     = f_circavg
 , stype     = float[]
 , finalfunc = f_circavg_final
 , initcond  = '{0,0,0}'
);

Fungsi transisi f_circavg() didefinisikan STRICT , sehingga mengabaikan baris dengan NULL memasukkan. Ini juga menetapkan elemen array ketiga untuk mengidentifikasi set dengan satu atau lebih baris input - selain itu CASE fungsi terakhir mengembalikan NULL .

Tabel sementara untuk pengujian:

CREATE TEMP TABLE t (x float);
INSERT INTO t VALUES (2), (NULL), (3), (4), (5);

Saya memasukkan NULL nilai untuk juga menguji STRICT sihir. Telepon:

SELECT circavg(x) FROM t;

       circavg
-------------------
 -2.78318530717959

Pemeriksaan silang:

SELECT atan2(sum(sin(x)), sum(cos(x))) FROM t;

       atan2
-------------------
 -2.78318530717959

Kembali sama. Tampaknya bekerja. Dalam pengujian dengan tabel yang lebih besar, ekspresi terakhir dengan fungsi agregat reguler 4x lebih cepat daripada agregat khusus.

Uji untuk baris input nol / hanya input NULL:

SELECT circavg(x) FROM t WHERE false;     -- no input rows
SELECT circavg(x) FROM t WHERE x IS NULL; -- only NULL input

Mengembalikan NULL dalam kedua kasus.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pencarian teks lengkap PG di rel menggunakan permata pg_search untuk substring

  2. [Video] Kekuatan Pengindeksan di PostgreSQL

  3. Impor byte mentah sebagai byte mentah di R

  4. Memodelkan tabel database Pengguna, Grup, dan Keanggotaan

  5. Agen PostgreSQL di komite Standar SQL lagi