У меня есть таблица со следующей структурой
|ChangedDate |IDParameter |ChangedTo (битовый столбец) |
Поэтому мне нужно получить временные интервалы, когда мой параметр имеет значение True или False, например:
|IDParameter |ChangedToDate1 |ChangedToDate2 |ChangedTo (true to false || false to true)
, и я делаю
With RankedDates As
(
Select T1.[ChangedDate], T1.ID, T1.[ChangedToValue]
, Row_Number() Over( Partition By T1.ID Order By T1.[ChangedDate] ) As Num
From [Changes] As T1
)
SELECT T1.[ID]
,T2.[ChangedToValue]
,T1.[ChangedDate] AS startDate
,T2.[ChangedDate] AS endDate
FROM [RankedDates] AS T1
Join RankedDates As T2
On T2.ID = T1.ID
And T2.Num = T1.Num + 1
And T2.[ChangedToValue] <> T1.[ChangedToValue]
Order By T2.[ChangedDate]
Проблема в том, что я пропускаю первый и последний интервалы здесь.это должно быть NULL для даты начала, если это первое, и NULL для endDate для последнего интервала для каждого ID параметра. Я думаю, мне нужно добавить его с помощью UNION, но я не могу понять, как добавить его для каждого IDParameter.
Я не знаю, когда значение было изменено в первый раз, и я не знаю, будет ли это значение изменено в любое время, поэтому мне нужно NULL или некоторое значение для первых интервалов и NULL или некоторое максимальное значение для последних интервалов..
ms sql server 2008
извините за такой сложный вопрос.
Пример:
08.03.2011 ID1 0 -> 1
09.03.2011 ID1 1 -> 0
09.03.2011 ID2 0 -> 1
10.03.2011 ID1 0 -> 1
10.03.2011 ID2 1 -> 0
-->
NULL , 08.03.2011 ID1 is 0
NULL , 09.03.2011 ID2 is 0
08.03.2011, 09.03.2011 ID1 is 1
09.03.2011, 10.03.2011 ID2 is 1
09.03.2011, 10.03.2011 ID1 is 0
10.03.2011, NULL ID1 is 1
10.03.2011, NULL ID2 is 0