समान विशेषताओं वाली कई पंक्तियों के लिए, मुझे आशा है कि दो मूल तालिका में कुछ अंक/नए कॉलम जोड़ेंगे।
मूल तालिका इस प्रकार है:
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 को ध्यान में रखते हुए मेरा दिमाग और भी गड़बड़ हो जाता है!
क्या कोई इस मुद्दे पर कुछ प्रकाश डालने में मदद कर सकता है?
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;
निम्नलिखित क्वेरी को वही करना चाहिए जो आप चाहते हैं:
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
संबंधित सवाल
नए सवाल
sql
संरचित क्वेरी भाषा (एसक्यूएल) डेटाबेस को क्वेरी करने के लिए एक भाषा है। प्रश्नों में कोड उदाहरण, तालिका संरचना, नमूना डेटा और DBMS कार्यान्वयन के लिए एक टैग (जैसे MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, आदि) का उपयोग किया जाना चाहिए। यदि आपका प्रश्न केवल एक विशिष्ट DBMS (विशिष्ट एक्सटेंशन / सुविधाओं का उपयोग करता है) से संबंधित है, तो इसके बजाय उस DBMS के टैग का उपयोग करें। एसक्यूएल के साथ टैग किए गए सवालों के जवाब में आईएसओ / आईईसी मानक एसक्यूएल का उपयोग करना चाहिए।