Một cách tiếp cận là sự khác biệt của số hàng:
select name, count(*)
from (select t.*,
(row_number() over (order by id) -
row_number() over (partition by name order by id)
) as grp
from t
) t
group by grp, name;
Logic dễ hiểu nhất nếu bạn chạy truy vấn con và xem xét các giá trị của từng số hàng một cách riêng biệt và sau đó xem xét sự khác biệt.