मैं इस कोड को लिखने के बारे में सलाह ढूंढ रहा हूं।

मेरे पास एक सिस्टम से दूसरे सिस्टम में पोर्ट किए जा रहे अद्वितीय मूल्यों की एक तालिका है। और मैं रिकॉर्ड लाने के अंतिम 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 प्रविष्टियां रखने की कुछ प्रकार की सफाई दिनचर्या रख सकता हूं।

क्षमा करें अगर मैं अस्पष्ट हो रहा हूँ।

0
Imran Saleem 10 अक्टूबर 2017, 14:46

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 डालने के बाद उपयोग करें।

0
gofr1 10 अक्टूबर 2017, 16:58

यदि आप सबसे हाल के 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 गतिविधियों को संभालते हैं।

0
Damien_The_Unbeliever 10 अक्टूबर 2017, 15:44