С lag()
оконной функцией:
select [item], [statusid], count(*) occurence
from (
select *,
lag([item]) over (order by (select null)) previtem,
lag([statusid]) over (order by (select null)) prevstatusid
from tablename
) t
where [item] <> previtem or [statusid] <> prevstatusid or (previtem is null and prevstatusid is null)
group by [item], [statusid]
См. Демоверсию . Результаты:
> item | statusid | occurence
> :----- | :------- | --------:
> pencil | A | 3
> pencil | B | 2
> pencil | C | 1
> eraser | D | 2
> eraser | E | 2
> eraser | F | 2
Примечание : проверьте ссылку в одном из комментариев @SeanLange. Этот код будет работать для размещенных вами примеров данных и для сравнительно небольшой таблицы, но не для очень большой таблицы. В любом случае вам понадобится столбец, который определяет порядок строк.