Сначала вместо создания постоянной таблицы я просто изменил ее на временную таблицу.
Итак, учитывая ваш пример, я пришел к следующему:
WITH CTE as(
select ROW_NUMBER() OVER(ORDER BY BLOCK) RN, LAG(Value1,1,VALUE1) OVER (ORDER BY BLOCK) LG,
GatewayDetailID, Block, Value1,Value2,Vaule3
from #tmp
),
CTE2 as (
select *, CASE WHEN LG <> VALUE1 THEN RN ELSE 0 END RowMark
from cte
),
CTE3 AS (
select MIN(Block) BL, RowMark from CTE2
GROUP BY ROwMark
),
CTE4 AS (
SELECT GatewayDetailID,Block,Value1,Value2,Vaule3,RMM from cte2 t1
CROSS APPLY (SELECT MAX(ROWMark) RMM FROM CTE3 t9 where t1.Block >= t9.ROwMark and t1.RN >= t9.RowMark) t2
)
SELECT GateWayDetailID,Block,Value1,Value2,Vaule3, ROW_NUMBER() OVER(Partition by RMM ORDER BY BLOCK) RN
FROM CTE4
ORDER BY BLOCK
Сначала у меня былочтобы получить номер строки для всех строк, затем, в зависимости от того, когда значение1 изменилось, я пометил это как новую группу.Из этого я создал CTE с датой и строкой границы для каждой группы.И, наконец, я перекрестно применил это обратно к таблице, чтобы найти каждую строку в каждой группе.
Из этого последнего CTE я просто применил простую функцию ROW_NUMBER (), разделенную на каждую группу RowMarker и номера строк poof ....
Возможно, есть лучший способ сделать это,но так я логично проработал проблему.