मेरे पास SQL ​​में निम्न तालिका है:

id,date,records
1,2019-03-28 01:22:12,5
2,2019-03-29 01:23:23,5
3,2019-03-30 01:28:54,5
4,2019-03-28 01:12:21,2
5,2019-03-12 01:08:11,1
6,2019-03-28 01:01:21,12
7,2019-03-12 01:02:11,1

जो मैं हासिल करने की कोशिश कर रहा हूं वह एक बैच संख्या निर्धारित करता है जो कि योग मूल्य 15 पार करने के बाद बढ़ते रहना चाहिए और चलती राशि को भी रीसेट करना चाहिए, इसलिए मैं रिकॉर्ड के लिए बैच बनाने की कोशिश कर रहा हूं जिसमें कुल चलती राशि 15 है

पूर्व के लिए। यदि मूविंग योग 15 हो जाता है तो बैच संख्या मान में वृद्धि होनी चाहिए, जिससे मुझे 15 के कुल मूल्य वाली पंक्तियाँ मिलेंगी।

इसलिए मैं जिस आउटपुट की तलाश कर रहा हूं वह है

id,date,records, moving_sum,batch_number
1,2019-03-28 01:22:12,5,5,1
2,2019-03-29 01:23:23,5,10,1
3,2019-03-30 01:28:54,5,15,1
4,2019-03-28 01:12:21,2,2,2
5,2019-03-12 01:08:11,1,1,2
6,2019-03-28 01:01:21,2,12,2
7,2019-03-12 01:02:11,1,1,3
1
MysticRose 14 अप्रैल 2020, 18:56

1 उत्तर

सबसे बढ़िया उत्तर

इसके लिए आपको एक पुनरावर्ती क्वेरी की आवश्यकता है:

with 
    tab as (select t.*, row_number() over(order by id) rn from mytable t),
    cte as (
        select 
            id, 
            date, 
            records, 
            records moving_sum, 
            1 batch_number,
            rn
        from tab
        where rn = 1
        union all
        select
            t.id,
            t.date,
            t.records,
            case when c.moving_sum + t.records > 15 then t.records else c.moving_sum + t.records end,
            case when c.moving_sum + t.records > 15 then c.batch_number + 1 else c.batch_number end,
            t.rn
        from cte c
        inner join tab t on t.rn = c.rn + 1
    )
select id, date, records, moving_sum, batch_number from cte order by id

पुनरावर्ती सामान्य तालिका अभिव्यक्तियों के लिए सिंटैक्स डेटाबेस में थोड़ा भिन्न होता है, इसलिए आपको अपने डेटाबेस के आधार पर इसे थोड़ा अनुकूलित करने की आवश्यकता हो सकती है।

यह भी ध्यान दें कि यदि id, 1 से शुरू होते हैं, और बिना अंतराल के हमेशा बढ़ते रहते हैं, तो आप वास्तव में सामान्य तालिका अभिव्यक्ति tab नहीं हैं, और आप rn को से बदल सकते हैं। id दूसरे कॉमन टेबल एक्सप्रेशन में।

DB Fiddle पर डेमो:

id | date       | records | moving_sum | batch_number
-: | :--------- | ------: | ---------: | -----------:
 1 | 2019-03-28 |       5 |          5 |            1
 2 | 2019-03-29 |       5 |         10 |            1
 3 | 2019-03-30 |       5 |         15 |            1
 4 | 2019-03-28 |       2 |          2 |            2
 5 | 2019-03-12 |       1 |          3 |            2
 6 | 2019-03-28 |      12 |         15 |            2
 7 | 2019-03-12 |       1 |          1 |            3
1
GMB 14 अप्रैल 2020, 16:14