Mam tabelę historii dla użytkownika i próbuję znaleźć zakresy dat, w których użytkownik posiadał określoną nazwę użytkownika. Tabela jest tabelą kontroli, która jest wypełniana przez wyzwalacz, więc ma wpisy za każdym razem, gdy następuje zmiana użytkownika, a nie tylko nazwy użytkownika. Mogę to zrobić, aby uzyskać zakres dat dla każdego wiersza:Podział tabeli na zakresy dat
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
wyjściowa:
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
Jednak to, co naprawdę chciałbym zrobić to zwinąć każdy czas nazwę użytkownika tak, że istnieje jeden wiersz według zakresu dat, w którym użytkownik posiadał nazwę użytkownika. Zasadniczo, szukam tego wyjścia:
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
Jak mam się poprawnie pomylić z tymi wierszami?
Poradź na dobre pytanie: przykładowy scenariusz dla "kopiuj", własne podejście, niepoprawne wyjście oczekiwane wyjście. – Shnugo