समान विशेषताओं वाली कई पंक्तियों के लिए, मुझे आशा है कि दो मूल तालिका में कुछ अंक/नए कॉलम जोड़ेंगे।

मूल तालिका इस प्रकार है:

ID    Start_date    End_Date    Amount
1     2005-01-01    2010-01-01    5
1     2000-07-01    2009-06-01    10
1     2017-08-01    2018-03-01    30

मैं इस रिकॉर्ड का उपयोग करने के लिए मुझे बताने के लिए जल्द से जल्द आरंभ तिथि, नवीनतम समाप्ति तिथि, अतिरिक्त राशि और एक संकेतक के साथ एक रिकॉर्ड रखना चाहता हूं। दूसरों के लिए, बस संकेतक का उपयोग करके मुझे बताएं कि मैं इसका उपयोग न करूं।

अद्यतन तालिका नीचे दी गई होनी चाहिए:

ID  Start_date  End_Date    Amount  Amount_new  Usable  Start          End
1   2005-01-01  2010-01-01  5         45         0     2000-07-01     2018-03-01
1   2000-07-01  2009-06-01  10                   1      
1   2017-08-01  2018-03-01  30                   1      

इससे कोई फर्क नहीं पड़ता कि कौन सी पंक्ति रखनी है, जब तक कि प्रयोग करने योग्य = 0 के साथ एक पंक्ति है, और Amount_new, प्रारंभ और समाप्ति अद्यतन हैं।

यदि अंतिम तिथि पर विचार नहीं किया जा रहा है, तो मैं आईडी और Start_date द्वारा समूहबद्ध करने के बारे में सोच रहा था, फिर पहली पंक्ति के कॉलम यूज़ेबल और राशि_न्यू को अपडेट करें। हालाँकि मुझे अभी भी समस्या है कि समूह द्वारा समूह से पहली पंक्ति का चयन कैसे किया जाए। End_Date को ध्यान में रखते हुए मेरा दिमाग और भी गड़बड़ हो जाता है!

क्या कोई इस मुद्दे पर कुछ प्रकाश डालने में मदद कर सकता है?

0
fanfan 25 जून 2019, 13:38

2 जवाब

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

ऐसा लगता है कि आप ऐसा कुछ चाहते हैं:

alter table original
    add amount_new int,
    add usable bit,
    add new_start,
    add new_end;

फिर, आप इसे विंडो फ़ंक्शंस का उपयोग करके अपडेट कर सकते हैं:

with toupdate as (
      select o.*,
             sum(amount) over (partition by id) as x_amount,
             (case when row_number() over (partition by id order by start_date) as x_usable,
             min(start_date) as x_start_date,
             max(end_date) as x_end_date
      from original o
     )
update toupdate
    set new_amount = x_amount,
        usable = x_usable,
        new_start = x_start_date,
        new_end = x_end_date;
0
Gordon Linoff 25 जून 2019, 14:08

निम्नलिखित क्वेरी को वही करना चाहिए जो आप चाहते हैं:

CREATE TABLE #temp (ID INT, [Start_date] DATE, End_Date DATE, Amount NUMERIC(28,0), Amount_new NUMERIC(28,0), Usable BIT, Start [Date], [End] [Date])

INSERT INTO #temp (ID, [Start_date], End_Date, Amount) VALUES
(1,'2005-01-01','2010-01-01',5),
(1,'2000-07-01','2009-06-01',10),
(1,'2017-08-01','2018-03-01',30),
(2,'2001-07-01','2009-06-01',5),
(2,'2017-08-01','2019-03-01',35)

UPDATE t1

SET Amount_new = t2.[Amount_new],
    Usable = 1,
    Start = t2.[Start],
    [End] = t2.[End]

FROM (SELECT *,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY (SELECT 1)) AS RNO FROM #temp) t1

INNER JOIN
(
SELECT ID,[Start_date],[End_Date],[Amount]
    ,SUM(Amount) OVER(PARTITION BY ID) AS [Amount_new]
    ,MIN([Start_date]) OVER(PARTITION BY ID) AS [Start]
    ,MAX(End_Date) OVER(PARTITION BY ID) AS [End]
    ,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY (SELECT 1)) AS RNO
FROM #temp ) t2 ON t1.id = t2.id AND t2.rno = t1.RNO AND t2.RNO = 1

SELECT * FROM #temp

परिणाम नीचे जैसा है,

ID  Start_date  End_Date    Amount  Amount_new  Usable  Start       End
1   2005-01-01  2010-01-01  5       45          1       2000-07-01  2018-03-01
1   2000-07-01  2009-06-01  10      NULL        NULL    NULL        NULL
1   2017-08-01  2018-03-01  30      NULL        NULL    NULL        NULL
2   2001-07-01  2009-06-01  5       40          1       2001-07-01  2019-03-01
2   2017-08-01  2019-03-01  35      NULL        NULL    NULL        NULL
0
MJoy 25 जून 2019, 15:50