Я думаю, что это будет работать, хотя SQLFiddle в данный момент подходит, поэтому я не могу проверить:
SELECT [Name], [Status], ct as [Count]
FROM (
SELECT
[name],
[status],
[date],
1 + (SUM( grp ) OVER (PARTITION BY [name], [status] ORDER BY [date] ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING ) * grp) ct,
row_number() over(partition by [name] order by [date] desc) rn
FROM
(
SELECT *, CASE WHEN LAG([Date]) OVER(PARTITION BY [name], [status] ORDER BY [date] ) = DATEADD(day, -1, [date]) THEN 1 ELSE 0 END grp
FROM t
) x
) y
WHERE
rn = 1
Сначала он использует LAG для просмотра текущей строки и предыдущей строки (группирование данных по имени и статусу машины, упорядочение данных по дате), и если текущая дата на 1 день отличается от предыдущей даты, он записывает 1 еще 0
Эти 1 и нули суммируются в виде промежуточного итога, сбрасываются при изменении имени машины или состояния (разделение суммы () на ())
Также мы хотим рассматривать данные только с точки зрения имени машины, и нам нужна только самая последняя запись с каждой машины, поэтому мы разбиваем по имени машины и считаем в порядке убывания даты, затем просто выбираем (с предложение where) строки с номерами 1 для каждой машины
На самом деле это имеет гораздо больше смысла, если вы выполняете запросы отдельно, как это
Рассчитать «текущий отчет, следующий за предыдущим отчетом, для данного состояния и машины» 1 = да, 0 = нет:
SELECT *, CASE WHEN LAG([Date]) OVER(PARTITION BY [name], [status] ORDER BY [date] ) = DATEADD(day, -1, [date]) THEN 1 ELSE 0 END grp
FROM t
Рассчитать «что является промежуточной суммой текущего блока последовательных отчетов»:
SELECT
[name],
[status],
[date],
1 + (SUM( grp ) OVER (PARTITION BY [name], [status] ORDER BY [date] ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING ) * grp) ct,
row_number() over(partition by [name] order by [date] desc) rn
FROM
(
SELECT *, CASE WHEN LAG([Date]) OVER(PARTITION BY [name], [status] ORDER BY [date] ) = DATEADD(day, -1, [date]) THEN 1 ELSE 0 END grp
FROM t
) x
Тогда, конечно, все это, но без предложения where, чтобы вы могли видеть данные, которые мы отбрасываем:
SELECT [Name], [Status], ct as [Count]
FROM (
SELECT
[name],
[status],
[date],
1 + (SUM( grp ) OVER (PARTITION BY [name], [status] ORDER BY [date] ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING ) * grp) ct,
row_number() over(partition by [name] order by [date] desc) rn
FROM
(
SELECT *, CASE WHEN LAG([Date]) OVER(PARTITION BY [name], [status] ORDER BY [date] ) = DATEADD(day, -1, [date]) THEN 1 ELSE 0 END grp
FROM t
) x
) y
Скрипка наконец проснулась:
http://www.sqlfiddle.com/#!18/77dae/2