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




sql-server sql-server-2012 (2)

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

|==========================================|
| 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 |
+----+------------+------------+

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





sql-server-2012