Вы можете использовать LAG
, чтобы получить предыдущие значения X1
и Date
.Если текущее значение X1
отличается от предыдущего, то у вас есть переход и вы можете рассчитать разницу в днях.
DECLARE @DataSource TABLE
(
[ID] SMALLINT
,[X1] CHAR(1)
,[Date] DATE
);
INSERT INTO @DataSource ([ID], [X1], [Date])
VALUES ('1', 'A', '2018-01-01')
,('1', 'A', '2018-01-20')
,('1', 'B', '2018-02-01')
,('1', 'A', '2018-02-15')
,('1', 'A', '2018-02-16')
,('1', 'B', '2018-03-01')
,('2', 'B', '2018-01-01')
,('2', 'C', '2018-03-05')
,('2', 'C', '2018-03-06')
,('2', 'C', '2018-03-08')
,('2', 'B', '2018-03-20');
SELECT *
,IIF
(
[X1] <> LAG([X1], 1, NULL) OVER(PARTITION BY [ID] ORDER BY [Date] ASC)
,DATEDIFF(DAY, LAG([Date], 1, NULL) OVER(PARTITION BY [ID] ORDER BY [Date] ASC), [Date])
,NULL
) AS [TransitionInDays]
FROM @DataSource;
![enter image description here](https://i.stack.imgur.com/v9kLA.png)
Обратите внимание, вам нужен SQL Server 2012+ для использования LAG
.Дайте мне знать, если это не так.