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

Niestandardowa agregacja PostgreSQL dla średniej kołowej

Możesz skorzystać z ARRAY wpisz wewnętrznie. Typ argumentu może nadal być dowolnym typem liczbowym. Demonstracja za pomocą 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}'
);

Funkcja przejścia f_circavg() jest zdefiniowany STRICT , więc ignoruje wiersze z NULL Wejście. Ustawia również trzeci element tablicy, aby identyfikować zestawy z jednym lub większą liczbą wierszy wejściowych - w przeciwnym razie CASE ostatnia funkcja zwraca NULL .

Tabela tymczasowa do testowania:

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

Wrzuciłem NULL wartość, aby przetestować również STRICT magia. Zadzwoń:

SELECT circavg(x) FROM t;

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

Kontrola krzyżowa:

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

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

Zwraca to samo. Wydaje się działać. W teście z większą tabelą ostatnie wyrażenie ze zwykłymi funkcjami agregacji było 4 razy szybsze niż agregacja niestandardowa.

Testuj pod kątem zerowych wierszy wejściowych / tylko wartości NULL:

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

Zwraca NULL w obu przypadkach.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zamykanie połączenia z bazą danych w Laravel 5.1

  2. XMLTABLE w PostgreSQL

  3. Tworzenie ciągu, którego wartości są mieszanką znaków i cyfr

  4. Monitorowanie dystrybucji Percona dla PostgreSQL — kluczowe metryki

  5. SQL:Znajdź najdłuższy wspólny ciąg między wierszami