मैं इस कोड को लिखने के बारे में सलाह ढूंढ रहा हूं।
मेरे पास एक सिस्टम से दूसरे सिस्टम में पोर्ट किए जा रहे अद्वितीय मूल्यों की एक तालिका है। और मैं रिकॉर्ड लाने के अंतिम 5 तिथियों का रिकॉर्ड संग्रहीत करना चाहता हूं।
तो उदाहरण के लिए, आइटम ए को 1 अक्टूबर 2017 को सिस्टम एक्स से सिस्टम वाई में रीफ्रेश किया गया है, मैं इस तिथि को तालिका में संग्रहीत करना चाहता हूं। फिर अगले महीने में, इसे 4 बार और लाया जाता है, इसलिए मैं चाहता हूं कि ये दिनांक मान भी उस तालिका में लिखे जाएं।
अब जबकि पिछली 5 तारीखें लिखी जा चुकी हैं, मुझे कोड को बनाए रखने के किसी तरीके की जरूरत है ताकि आने वाली कोई भी नई तारीखें तालिका डेटा को अधिलेखित कर दें, ताकि हमारे पास इस तालिका में हमेशा अंतिम 5 अद्यतन तिथियां रहेंगी।
उदाहरण डेटा; दिनांक कॉलम पिछले 5 अद्यतनों का प्रतिनिधित्व करते हैं जो प्रत्येक गुण पंक्ति के लिए हुए हैं।
Property ID's, Date 1, Date 2, Date 3, Date 4, Date 5
1 01/07/17, 01/08/17 01/10/17 05/10/17 10/10/17
2 01/01/17 01/03/17 01/06/17 05/10/17 10/10/17
3 01/02/17 05/02/17 01/10/17 05/10/17 10/10/17
4 01/03/17 01/08/17 01/10/17
यदि गुण 4 में सिस्टम X का अद्यतन है, तो दिनांक 4 पॉप्युलेट हो जाता है। यदि प्रॉपर्टी 3 में सिस्टम x से अपडेट है, तो दिनांक 2 से 5 तक एक स्थान बाईं ओर चला जाएगा और दिनांक 5 नवीनतम तिथि के साथ पॉप्युलेट हो जाएगा।
क्या यह पिछले 5 अपडेट रिकॉर्ड करने का सबसे अच्छा तरीका होगा।
वैकल्पिक रूप से, मैं केवल प्रत्येक संपत्ति आईडी और अद्यतन की तारीख को एक तालिका में लिख सकता हूं और प्रति संपत्ति केवल 5 प्रविष्टियां रखने की कुछ प्रकार की सफाई दिनचर्या रख सकता हूं।
क्षमा करें अगर मैं अस्पष्ट हो रहा हूँ।
2 जवाब
तालिका का बेहतर उपयोग करें जैसे:
CREATE TABLE dbo.ChangeDates (
PropertyID int,
DateChanged date
)
और इसमें सिर्फ डेटा लिखें। फिर जैसे दृश्य बनाएं:
CREATE VIEW dbo.Top5ChangeDates
AS
WITH cte AS (
SELECT PropertyID,
DateChanged,
ROW_NUMBER() OVER (PARTITION BY PropertyID ORDER BY DateChanged DESC) as rn
FROM dbo.ChangeDates
)
SELECT PropertyID,
DateChanged
FROM cte
WHERE rn <= 5
GO
या डेटा साफ़ करने के लिए, देखने के बजाय TRIGGER डालने के बाद उपयोग करें।
यदि आप सबसे हाल के 5 रिकॉर्ड रखना चाहते हैं तो ऐसा लगता है कि MERGE
, एक साथ INSERT
और DELETE
गतिविधि की अनुमति देने का रास्ता हो सकता है।
यह स्क्रिप्ट एक MERGE
प्रदर्शित करती है जो प्रति ID
मान में नवीनतम 5 पंक्तियां रखती है:
create table #History (ID int not null, OccurredAt datetime2(7) not null)
go
declare @current table (ID int not null)
insert into @current (ID) values (1),(3)
;With Keeps as (
select
*,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY OccurredAt desc) as rn
from #History
where ID in (select ID from @current)
)
merge into #History t
using (select ID,SYSDATETIME() from @current
union all
select ID,OccurredAt from Keeps where rn between 1 and 4) s(ID,OccurredAt)
on
t.ID = s.ID and
t.OccurredAt = s.OccurredAt
when not matched then insert (ID,OccurredAt) values (s.ID,s.OccurredAt)
when not matched by source and t.ID in (select ID from @current) then delete;
waitfor delay '00:00:01'
go 30
select * from #History
उम्मीद है कि आप देख सकते हैं कि सीटीई "अन्य" पंक्तियों को कैसे ढूंढता है जिन्हें संरक्षित किया जाना चाहिए और कैसे दो not matched
खंड INSERT
और DELETE
गतिविधियों को संभालते हैं।
संबंधित सवाल
नए सवाल
sql-server
Microsoft SQL सर्वर एक रिलेशनल डेटाबेस मैनेजमेंट सिस्टम (RDBMS) है। कॉम्पैक्ट, एक्सप्रेस, एज़्योर, फास्ट-ट्रैक, एपीएस (पूर्व में पीडीडब्ल्यू) और एज़्योर SQL डीडब्ल्यू सहित सभी SQL सर्वर संस्करणों के लिए इस टैग का उपयोग करें। अन्य प्रकार के DBMS (MySQL, PostgreSQL, Oracle, आदि) के लिए इस टैग का उपयोग न करें। सॉफ़्टवेयर और मोबाइल विकास के मुद्दों के लिए इस टैग का उपयोग न करें, जब तक कि यह सीधे डेटाबेस से संबंधित न हो।