अपना खुद का एग्रीगेट फंक्शन बनाएं , जिसका उपयोग विंडो फ़ंक्शन के रूप में किया जा सकता है।
विशिष्ट समग्र कार्य
किसी के विचार से यह आसान है:
CREATE OR REPLACE FUNCTION f_sum_cap50 (numeric, numeric)
RETURNS numeric LANGUAGE sql AS
'SELECT CASE WHEN $1 > 50 THEN 0 ELSE $1 END + $2';
CREATE AGGREGATE sum_cap50 (numeric) (
sfunc = f_sum_cap50
, stype = numeric
, initcond = 0
);
फिर:
SELECT *, sum_cap50(val) OVER (PARTITION BY fk
ORDER BY created) > 50 AS threshold_met
FROM test
WHERE fk = 5;
परिणाम बिल्कुल अनुरोध के अनुसार।
db<>fiddle यहां
पुराना sqlfiddle
उप>
सामान्य समग्र कार्य
इसे किसी भी सीमा के लिए कारगर बनाने के लिए और कोई भी (संख्यात्मक) डेटा प्रकार , और साथ ही अनुमति दें NULL
मान :
CREATE OR REPLACE FUNCTION f_sum_cap (anyelement, anyelement, anyelement)
RETURNS anyelement
LANGUAGE sql STRICT AS
$$SELECT CASE WHEN $1 > $3 THEN '0' ELSE $1 END + $2;$$;
CREATE AGGREGATE sum_cap (anyelement, anyelement) (
sfunc = f_sum_cap
, stype = anyelement
, initcond = '0'
);
फिर, किसी भी संख्यात्मक प्रकार के साथ, जैसे, 110 की सीमा के साथ कॉल करने के लिए:
SELECT *
, sum_cap(val, '110') OVER (PARTITION BY fk
ORDER BY created) AS capped_at_110
, sum_cap(val, '110') OVER (PARTITION BY fk
ORDER BY created) > 110 AS threshold_met
FROM test
WHERE fk = 5;
db<>fiddle यहां
पुराना sqlfiddle
उप>
स्पष्टीकरण
आपके मामले में हमें NULL
. से बचाव करने की आवश्यकता नहीं है val
. के बाद से मान परिभाषित किया गया है NOT NULL
. अगर NULL
शामिल किया जा सकता है, परिभाषित करें f_sum_cap()
STRICT
. के रूप में और यह काम करता है क्योंकि (प्रति दस्तावेज़
):
फ़ंक्शन और समुच्चय दोनों एक और तर्क लेते हैं। बहुरूपी के लिए भिन्न यह एक हार्ड कोडित डेटा प्रकार या प्रमुख तर्कों के समान बहुरूपी प्रकार हो सकता है।
बहुरूपी कार्यों के बारे में:
बिना टाइप किए गए स्ट्रिंग अक्षर के उपयोग पर ध्यान दें , सांख्यिक शाब्दिक नहीं, जो डिफ़ॉल्ट रूप से integer
. होगा !