2016-02-22 14 views
6

मेरे पास उपयोगकर्ता के लिए इतिहास की एक सारणी है, और मैं उस दिनांक सीमा को खोजने का प्रयास कर रहा हूं जिसमें उपयोगकर्ता ने एक विशिष्ट उपयोगकर्ता नाम रखा था। तालिका एक ऑडिट तालिका है जो एक ट्रिगर द्वारा भर जाती है, इसलिए प्रत्येक बार उपयोगकर्ता नाम में परिवर्तन होता है, न केवल उपयोगकर्ता नाम के लिए। मैं यह कर सकता प्रत्येक पंक्ति के लिए तिथि सीमा प्राप्त करने के लिए:तिथि सीमा प्राप्त करने के लिए एक तालिका विभाजन

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 मूल्यों होने पंक्तियों की पहचान में मदद करता है:

+0

एक अच्छे प्रश्न के लिए उपरोक्त: प्रतिलिपि के लिए नमूना परिदृश्य, अपना दृष्टिकोण, गलत आउटपुट अपेक्षित आउटपुट। – Shnugo

उत्तर

3

आप निम्न क्वेरी का उपयोग कर सकते हैं।

+0

सुंदर; धन्यवाद! – zimdanen

संबंधित मुद्दे