PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

Postgres में गतिशील आधार के साथ संचयी जोड़ना

अपना खुद का एग्रीगेट फंक्शन बनाएं , जिसका उपयोग विंडो फ़ंक्शन के रूप में किया जा सकता है।

विशिष्ट समग्र कार्य

किसी के विचार से यह आसान है:

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 . होगा !




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL 9.3 . का उपयोग करके डायनामिक पिवट क्वेरी

  2. PostgreSQL ट्रिगर कुछ भी वापस नहीं कर रहा है

  3. PostgreSQL 9.4.2 . में कौन सा लॉक, यदि कोई हो, 'CREATE TRIGGER' उपयोग करता है?

  4. psycopg2 :कर्सर पहले ही बंद है

  5. प्रकार का स्तंभ बनाएं डबल परिशुद्धता [] लिक्विबेस के साथ