ठीक है, इसे समझाना मुश्किल होगा।
प्रत्येक स्थिति के लिए प्रत्येक तिथि पर, आपको दो मानों की गणना करनी चाहिए:
- उस स्थिति से शुरू होने वाले ग्राहकों की संख्या।
- उस स्थिति को छोड़ने वाले ग्राहकों की संख्या।
पहला मूल्य आसान है। यह केवल तिथि और स्थिति के अनुसार लेन-देन का एकत्रीकरण है।
दूसरा मान लगभग उतना ही आसान है। आपको पिछला . मिलता है स्थिति कोड और उस तिथि को स्थिति कोड "छोड़ने" की संख्या की गणना करें।
फिर, कुंजी पहले मान का संचयी योग घटा दूसरे मान का संचयी योग है।
मैं स्वतंत्र रूप से स्वीकार करता हूं कि निम्नलिखित कोड का परीक्षण नहीं किया गया है (यदि आपके पास SQL Fiddle था, तो मुझे इसका परीक्षण करने में खुशी होगी)। लेकिन परिणामी क्वेरी इस तरह दिखती है:
select status_dte, status_cd,
(sum(inc_cnt) over (partition by status_cd order by status_dt) -
sum(dec_cnt) over (partition by status_cd order by status_dt)
) as dateamount
from ((select t.status_dt, t.status_cd, count(*) as inc_cnt, 0 as dec_cnt
from transactions t
group by t.status_dt, t.status_cd
) union all
(select t.status_dt, prev_status_cd, 0, count(*)
from (select t.*
lag(t.status_cd) over (partition by t.account_id order by status_dt) as prev_status_cd
from transactions t
) t
where prev_status_cd is null
group by t.status_dt, prev_status_cd
)
) t;
यदि आपके पास ऐसी तिथियां हैं जहां एक या अधिक स्थितियों के लिए कोई परिवर्तन नहीं है और आप उन्हें आउटपुट में शामिल करना चाहते हैं, तो उपरोक्त क्वेरी को cross join
. का उपयोग करने की आवश्यकता होगी पहले परिणाम सेट में पंक्तियाँ बनाने के लिए। यह स्पष्ट नहीं है कि क्या यह एक आवश्यकता है, इसलिए मैं उस जटिलता को छोड़ रहा हूँ।