Прежде всего нам нужно определить способ упорядочения строк. Например, в ваших данных выборки невозможно гарантировать, что «первая» строка (1, 1)
всегда будет отображаться перед «второй» строкой (1,0)
.
. Поэтому в моих данных выборкидобавлен идентификационный столбец. В вашем реальном случае детали могут быть упорядочены по идентификатору строки, столбцу даты или как-то еще, но вы должны убедиться, что строки могут быть отсортированы по уникальным критериям.
Итак, задача довольно проста:
- вычислить переключатель триггера - при изменении значения
- вычислить группы
- вычислить строки
Вот и все. Я использовал общее табличное выражение и оставил все столбцы, чтобы вам было легче понять логику. Вы можете разбить это на отдельные утверждения и удалить некоторые столбцы.
DECLARE @DataSource TABLE
(
[RowID] INT IDENTITY(1, 1)
,[ID]INT
,[value] INT
);
INSERT INTO @DataSource ([ID], [value])
VALUES (1, 1)
,(1, 0)
,(1, 0)
,(1, 1)
,(1, 1)
,(1, 1)
--
,(2, 0)
,(2, 1)
,(2, 0)
,(2, 0);
WITH DataSourceWithSwitch AS
(
SELECT *
,IIF(LAG([value]) OVER (PARTITION BY [ID] ORDER BY [RowID]) = [value], 0, 1) AS [Switch]
FROM @DataSource
), DataSourceWithGroup AS
(
SELECT *
,SUM([Switch]) OVER (PARTITION BY [ID] ORDER BY [RowID]) AS [Group]
FROM DataSourceWithSwitch
)
SELECT *
,ROW_NUMBER() OVER (PARTITION BY [ID], [Group] ORDER BY [RowID]) AS [GroupRowID]
FROM DataSourceWithGroup
ORDER BY [RowID];