PostgreSQL में संचयी योग की गणना



window-functions analytic-functions (1)

असल में, आपको यहां एक विंडो फ़ंक्शन की आवश्यकता है। यह आजकल एक मानक विशेषता है। वास्तविक विंडो फ़ंक्शंस के अतिरिक्त, आप किसी भी समग्र फ़ंक्शन का उपयोग पोस्टग्रेस में विंडो फ़ंक्शन के रूप में ओवरवॉर्ड्स जोड़कर कर सकते हैं।

यहां विशेष कठिनाई विभाजन और क्रमबद्ध क्रम प्राप्त करने के लिए है:

SELECT ea_month, id, amount, ea_year, circle_id
     , sum(amount) OVER (PARTITION BY circle_id ORDER BY ea_year, ea_month) AS cum_amt
FROM   tbl
ORDER  BY circle_id, month;

और यहां कोई GROUP BY नहीं है।

प्रत्येक पंक्ति के लिए योग विभाजन में पहली पंक्ति से वर्तमान पंक्ति तक गणना की जाती है - या मैन्युअल को सटीक होने के लिए उद्धृत करना :

डिफॉल्ट फ़्रेमिंग विकल्प RANGE UNBOUNDED PRECEDING , जो RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW के समान है। ORDER BY साथ, यह फ्रेम को वर्तमान पंक्ति के अंतिम ORDER BY सहकर्मी ORDER BY शुरू होने वाले विभाजन से सभी पंक्तियों के रूप में सेट करता है।

... जो संचयी या चलती राशि है जिसके बाद आप हैं। बोल्ड जोर मेरा है।

इस क्वेरी में पंक्तियां (circle_id, ea_year, ea_month) "सहकर्मी" हैं । वे सभी योग में जोड़े गए सभी सहकर्मियों के साथ समान चल रहे योग दिखाते हैं। लेकिन मुझे लगता है कि आपकी तालिका UNIQUE है (circle_id, ea_year, ea_month) , तो सॉर्ट ऑर्डर निर्धारक है और कोई पंक्ति सहकर्मी नहीं है।

अब, ORDER BY ... ea_month महीने के नामों के लिए तारों के साथ काम नहीं करेगा । पोस्टग्रेज़ लोकेल सेटिंग के अनुसार वर्णानुक्रम में क्रमबद्ध होंगे।

यदि आपके पास आपकी तालिका में संग्रहीत वास्तविक date मान हैं तो आप ठीक से सॉर्ट कर सकते हैं। यदि नहीं, तो मैं आपकी तालिका में टाइप date की एक कॉलम mon के साथ ea_year और ea_month को प्रतिस्थापित करने का सुझाव देता हूं।

  • to_date() साथ आपके पास रूपांतरण करें:

    to_date(ea_year || ea_month , 'YYYYMonth') AS mon
    
  • डिस्प्ले के लिए आप मूल तारों को to_date() साथ प्राप्त कर सकते हैं:

    to_char(mon, 'Month') AS ea_month
    to_char(mon, 'YYYY') AS ea_year
    

दुर्भाग्यपूर्ण लेआउट के साथ अटक गए, यह काम करेगा:

SELECT ea_month, id, amount, ea_year, circle_id
     , sum(amount) OVER (PARTITION BY circle_id ORDER BY mon) AS cum_amt
FROM   (SELECT *, to_date(ea_year || ea_month, 'YYYYMonth') AS mon FROM tbl)
ORDER  BY circle_id, mon;

मैं संचयी या चलने वाली मात्रा को फ़ील्ड ढूंढना चाहता हूं और इसे स्टेजिंग से टेबल में डालना चाहता हूं। मेरी स्टेजिंग संरचना इस तरह कुछ है:

ea_month    id       amount    ea_year    circle_id
April       92570    1000      2014        1
April       92571    3000      2014        2
April       92572    2000      2014        3
March       92573    3000      2014        1
March       92574    2500      2014        2
March       92575    3750      2014        3
February    92576    2000      2014        1
February    92577    2500      2014        2
February    92578    1450      2014        3          

मैं अपनी लक्ष्य तालिका इस तरह कुछ दिखाना चाहता हूं:

ea_month    id       amount    ea_year    circle_id    cum_amt
February    92576    1000      2014        1           1000 
March       92573    3000      2014        1           4000
April       92570    2000      2014        1           6000
February    92577    3000      2014        2           3000
March       92574    2500      2014        2           5500
April       92571    3750      2014        2           9250
February    92578    2000      2014        3           2000
March       92575    2500      2014        3           4500
April       92572    1450      2014        3           5950

मैं इस परिणाम को प्राप्त करने के बारे में वास्तव में बहुत उलझन में हूं। मैं PostgreSQL का उपयोग करके इस परिणाम को प्राप्त करना चाहता हूं।

क्या कोई सुझाव दे सकता है कि इस परिणाम-सेट को प्राप्त करने के बारे में कैसे जाना है?





cumulative-sum