आप एक ARRAY . का उपयोग कर सकते हैं आंतरिक टाइप करें। तर्क प्रकार अभी भी कोई भी संख्यात्मक प्रकार हो सकता है। 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}'
);
ट्रांज़िशन फ़ंक्शन f_circavg()
परिभाषित किया गया है STRICT
, इसलिए यह NULL
. वाली पंक्तियों पर ध्यान नहीं देता इनपुट। यह एक या अधिक इनपुट पंक्तियों के साथ सेट की पहचान करने के लिए तीसरा सरणी तत्व भी सेट करता है - अन्यथा CASE
अंतिम फ़ंक्शन NULL
लौटाता है ।
परीक्षण के लिए अस्थायी तालिका:
CREATE TEMP TABLE t (x float);
INSERT INTO t VALUES (2), (NULL), (3), (4), (5);
मैंने एक NULL
में फेंक दिया STRICT
का परीक्षण करने के लिए मान भी जादू। कॉल करें:
SELECT circavg(x) FROM t;
circavg
-------------------
-2.78318530717959
क्रॉस चेक:
SELECT atan2(sum(sin(x)), sum(cos(x))) FROM t;
atan2
-------------------
-2.78318530717959
वही लौटाता है। काम करने लगता है। एक बड़ी तालिका के साथ परीक्षण में नियमित समग्र कार्यों के साथ अंतिम अभिव्यक्ति कस्टम कुल से 4x तेज थी।
शून्य इनपुट पंक्तियों / केवल NULL इनपुट के लिए परीक्षण करें:
SELECT circavg(x) FROM t WHERE false; -- no input rows
SELECT circavg(x) FROM t WHERE x IS NULL; -- only NULL input
रिटर्न NULL
दोनों ही मामलों में।