Это проблема промежутков и островов. Вы можете идентифицировать острова, вычитая из даты последовательность целых чисел - постоянные различия определяют соседние даты. Затем используйте count(*)
в качестве оконной функции:
select t.*,
count(*) over (partition by clientid, serviceid, dateadd(day, -seqnum, date)) as consecutive_days
from (select t.*,
row_number() over (partition by clientid, serviceid order by date) as seqnum
from t
) t