sql-server - SQL सर्वर में रिकॉर्ड्स में परिवर्तन कैसे ट्रैक करें?




sql-server-2012 (4)

यह उन तालिकाओं पर डालें / अपडेट ट्रिगर करने के बाद बना कर किया जा सकता है जिन्हें आपको ट्रैक करने की आवश्यकता है। तार्किक तालिकाओं का उपयोग करना SQL सर्वर में डाला / हटाया गया आप एक टेबल पर नए डाले गए और संशोधित फ़ील्ड को ट्रैक कर सकते हैं।

सम्मिलित (तार्किक तालिका): यह आपको नए डाले गए अभिलेख / अपडेट किए गए मानों (स्तंभ मान) का विवरण देगा।

हटाए गए (तार्किक तालिका): इससे पहले कि आप संशोधित / हटाए गए, इससे पहले आपको फ़ील्ड का पुराना मान दिया जाएगा।

मेरे पास निम्न तालिका है जिसमें सभी छात्रों के रिकॉर्ड पर नज़र रखता है।

|==========================================|
| ID      |  Department     | Date         |
|==========================================|
| 001     | English         | Feb 3 2017   |
| 001     | English         | Feb 4 2017   |
| 001     | Science         | Mar 1 2017   |
| 001     | Science         | Apr 2 2017   |
| 001     | Maths           | Apr 7 2017   |
| 002     | Maths           | Feb 1 2017   |
| 002     | Maths           | Apr 7 2017   |
| 003     | Maths           | Apr 3 2017   |
| 004     | Science         | Feb 1 2017   |
| 004     | Maths           | Apr 7 2017   |
|==========================================| 

मुझे पिछला रिकॉर्ड लाने की आवश्यकता है, जब छात्र ने विभाग को बदल दिया है। उपर्युक्त उदाहरण के लिए, रिकॉर्डेड सेट वापस होना चाहिए

001 के लिए,

| 001     | English         | Feb 4 2017   |
| 001     | Science         | Apr 2 2017   |

002 और 003 के लिए

कोई बदलाव नहीं

004 के लिए

| 004     | Science         | Feb 1 2017   |

यह भी एक संभावना है कि एक ही उपयोगकर्ता एक ही विभाग में वापस बदल सकता है। उदाहरण के लिए, उपयोगकर्ता 2001 में डीप टू से डीप्टन बी से डीप्पट करने के लिए बदल सकते हैं और एक को डीप कर सकते हैं। मैंने टी-एसक्यूएल के बारे में पढ़ा है और प्राप्त करते हैं। लेकिन यकीन नहीं है कि अगर इस परिदृश्य में मदद मिलेगी। कृपया मदद करे।


मैं इसके बारे में निश्चित नहीं हूँ, लेकिन आप संग्रहित प्रक्रियाओं की अवधारणा के साथ मदद प्राप्त कर सकते हैं। वे कार्य हैं जो डेटाबेस का एक हिस्सा हैं जब आप क्वेरी बनाते हैं तो आप डिस्प्ले सेट कर सकते हैं


ऐसा करने का एक तरीका विभाजन कॉलम के मूल्य में पता ROW_NUMBER जाने के लिए विभाजन के साथ ROW_NUMBER फ़ंक्शन का उपयोग करना है।

नमूना डेटा

DECLARE @T TABLE (ID int, Department nvarchar(100), dt date);
INSERT INTO @T (ID, Department, dt) VALUES
(1, 'English', 'Feb 3 2017'),
(1, 'English', 'Feb 4 2017'),
(1, 'Science', 'Mar 1 2017'),
(1, 'Science', 'Apr 2 2017'),
(1, 'Maths  ', 'Apr 7 2017'),
(2, 'Maths  ', 'Feb 1 2017'),
(2, 'Maths  ', 'Apr 7 2017'),
(3, 'Maths  ', 'Apr 3 2017'),
(4, 'Science', 'Feb 1 2017'),
(4, 'Maths  ', 'Apr 7 2017');

सवाल

WITH
CTE
AS
(
    SELECT
        ID
        ,Department
        ,dt
        ,ROW_NUMBER() OVER (PARTITION BY ID, Department ORDER BY dt DESC) AS rnPart
        ,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY dt DESC) AS rnID
    FROM @T
)
SELECT
    ID
    ,Department
    ,dt
FROM CTE
WHERE
    rnPart = 1
    AND rnID <> 1
ORDER BY
    ID
    ,dt
;

परिणाम

+----+------------+------------+
| ID | Department |     dt     |
+----+------------+------------+
|  1 | English    | 2017-02-04 |
|  1 | Science    | 2017-04-02 |
|  4 | Science    | 2017-02-01 |
+----+------------+------------+

मैं इसे केवल जोड़ता हूं ताकि आप इसे लिखने का एक त्वरित तरीका देख सकें ताकि आप यह जांच सकें कि अपडेट करने से पहले क्या अपडेट किया जाएगा।

UPDATE Table 
SET  Table.col1 = other_table.col1,
     Table.col2 = other_table.col2 
--select Table.col1, other_table.col,Table.col2,other_table.col2, *   
FROM     Table 
INNER JOIN     other_table 
    ON     Table.id = other_table.id 




sql sql-server sql-server-2012