Интересно, что если вам нужно только максимальное значение, это значительно упрощает задачу, поскольку вам нужно только создать счетчик для строк, в которых произошло изменение, а затем получить максимальное значение:
WITH tCountAtChange as
(SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY date_time) + 1 as aCounter
FROM
(SELECT UniqueNbr, date_time, id
,CASE WHEN LAG(changer) OVER (PARTITION BY id ORDER BY date_time) <> changer THEN 'YES' ELSE 'NO' END as ChangeFlag
FROM MyTable) a
WHERE ChangeFlag = 'YES')
SELECT MyTable.id, COALESCE(MAX(aCounter), 1) as MaxCounter
FROM MyTable
LEFT JOIN tCountAtChange
ON MyTable.UniqueNbr = tCountAtChange.UniqueNbr
GROUP BY MyTable.id
Результат:
id MaxCounter
1 4
2 3
3 4
Вам понадобится поле date_time или какое-либо поле сортировки для предложений ORDER BY, а также UniqueNbr (уникальный идентификатор), который вы можете использовать для объединения, или вы всегда можете создать его в другом cte с помощью функции ROW_NUMBER.