मेरे पास उपयोगकर्ता के लिए इतिहास की एक सारणी है, और मैं उस दिनांक सीमा को खोजने का प्रयास कर रहा हूं जिसमें उपयोगकर्ता ने एक विशिष्ट उपयोगकर्ता नाम रखा था। तालिका एक ऑडिट तालिका है जो एक ट्रिगर द्वारा भर जाती है, इसलिए प्रत्येक बार उपयोगकर्ता नाम में परिवर्तन होता है, न केवल उपयोगकर्ता नाम के लिए। मैं यह कर सकता प्रत्येक पंक्ति के लिए तिथि सीमा प्राप्त करने के लिए:तिथि सीमा प्राप्त करने के लिए एक तालिका विभाजन
CREATE TABLE #LoginHistory
(
LoginHistoryID INT IDENTITY(1,1),
LoginID INT,
Username VARCHAR(32),
StartDate DATETIME
)
INSERT INTO #LoginHistory (LoginID, Username, StartDate) VALUES
(1, 't', '2016-01-01'),
(1, 't', '2016-01-02'),
(1, 't', '2016-01-04'),
(1, 'test', '2016-01-05'),
(2, 't', '2016-01-08'),
(2, 'tom', '2016-01-09'),
(1, 'test', '2016-01-15'),
(1, 't', '2016-02-01')
SELECT
LoginID,
Username,
StartDate,
EndDate = LEAD(StartDate) OVER (PARTITION BY LoginID ORDER BY StartDate ASC)
FROM #LoginHistory
WHERE LoginID = 1
ORDER BY StartDate ASC
DROP TABLE #LoginHistory
आउटपुट:
LoginID Username StartDate EndDate
1 t 2016-01-01 00:00:00.000 2016-01-02 00:00:00.000
1 t 2016-01-02 00:00:00.000 2016-01-04 00:00:00.000
1 t 2016-01-04 00:00:00.000 2016-01-05 00:00:00.000
1 test 2016-01-05 00:00:00.000 2016-01-15 00:00:00.000
1 test 2016-01-15 00:00:00.000 2016-02-01 00:00:00.000
1 t 2016-02-01 00:00:00.000 NULL
हालांकि, क्या मैं वास्तव में क्या करना चाहते हैं ताकि एक पंक्ति है प्रत्येक उपयोगकर्ता नाम अवधि संक्षिप्त करने के लिए है प्रति तिथि सीमा जिसे उपयोगकर्ता ने उपयोगकर्ता नाम दिया था। असल में, मैं इस आउटपुट की तलाश में हूं:
LoginID Username StartDate EndDate
1 t 2016-01-01 00:00:00.000 2016-01-05 00:00:00.000
1 test 2016-01-05 00:00:00.000 2016-02-01 00:00:00.000
1 t 2016-02-01 00:00:00.000 NULL
मैं इन पंक्तियों को सही ढंग से ध्वस्त करने के बारे में कैसे जाउंगा?
SELECT LoginID,
Username,
MIN(StartDate) AS StartDate,
MAX(EndDate) AS EndDate
FROM (
SELECT
LoginID,
Username,
StartDate,
EndDate = LEAD(StartDate) OVER (PARTITION BY LoginID
ORDER BY StartDate ASC),
ROW_NUMBER() OVER (ORDER BY StartDate) -
ROW_NUMBER() OVER (PARTITION BY LoginID, Username
ORDER BY StartDate) AS grp
FROM #LoginHistory
WHERE LoginID = 1) AS t
GROUP BY LoginID, Username, grp
ORDER BY StartDate ASC
grp
आप लगातार ही LoginID, Username
मूल्यों होने पंक्तियों की पहचान में मदद करता है:
एक अच्छे प्रश्न के लिए उपरोक्त: प्रतिलिपि के लिए नमूना परिदृश्य, अपना दृष्टिकोण, गलत आउटपुट अपेक्षित आउटपुट। – Shnugo