Вы почти сделали это.Вот полный рабочий пример:
DECLARE @DataSource TABLE
(
[date_time] DATETIME2(0)
,[position_1] BIT
,[position_2] BIT
,[position_3] BIT
);
INSERT INTO @DataSource ([date_time], [position_1], [position_2], [position_3])
VALUES ('2018-01-05 06:30:00', 0, 0, 0)
,('2018-01-05 06:35:00', 0, 0, 1)
,('2018-01-05 06:40:00', 1, 0, 1)
,('2018-01-05 06:45:00', 1, 0, 0)
,('2018-01-05 06:50:00', 1, 1, 0)
,('2018-01-05 06:55:00', 0, 1, 1)
,('2018-01-05 07:00:00', 0, 1, 1);
WITH DataSource ([row_id], [date_time], [position_1], [position_2], [position_3], x, y, z) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY [date_time])
,[date_time]
,IIF([position_1] = 1, CONCAT('p1_', ROW_NUMBER() OVER (ORDER BY [date_time])), NULL)
,IIF([position_2] = 1, CONCAT('p1_', ROW_NUMBER() OVER (ORDER BY [date_time])), NULL)
,IIF([position_3] = 1, CONCAT('p1_', ROW_NUMBER() OVER (ORDER BY [date_time])), NULL)
--
,COUNT(IIF([position_1] = 0, 1, NULL)) OVER (ORDER BY [date_time])
,COUNT(IIF([position_2] = 0, 1, NULL)) OVER (ORDER BY [date_time])
,COUNT(IIF([position_3] = 0, 1, NULL)) OVER (ORDER BY [date_time])
FROM @DataSource
)
SELECT [row_id]
,[date_time]
,IIF([position_1] IS NULL, '0', MIN([position_1]) OVER (PARTITION BY x))
,IIF([position_2] IS NULL, '0', MIN([position_2]) OVER (PARTITION BY y))
,IIF([position_3] IS NULL, '0', MIN([position_3]) OVER (PARTITION BY z))
FROM DataSource;
![enter image description here](https://i.stack.imgur.com/K8lE6.png)
Как я уже сказал, вы почти сделали это.Я просто добавил три дополнительных столбца, чтобы отметить группы, в которых нужно найти минимальное значение.