An easy way to solve this problem is as the difference of two row numbers. This uniquely identifies each sequence of values. Then use dense_rank()
. Here is the query:
select ID, Letter, Number,
dense_rank() over (order by diff, letter) as GroupId
from (select i.*,
(row_number() over (order by id) -
row_number() over (partition by letter order by id)
) as diff
from #items i
) t
Given your data, here is what the row numbers, differences, and final value look like:
ID Letter Number RN-ID RN-Letter Diff GroupId
1 A 1 1 1 0 1
2 B 2 2 1 1 2
3 B 2 3 2 1 2
4 B 2 4 3 1 2
5 A 1 5 2 3 3
Voila! Almost like magic.
Here is the example on SQL Fiddle.