Row_Number() CASE .
, .
Declare @YourTable table (ID int,col1 varchar(25))
Insert Into @YourTable values
(1,'X'),
(2,'X'),
(3,'A'),
(4,'B'),
(5,'X'),
(6,'C'),
(7,'X'),
(8,'D')
Select ID,Col1
,Counter = max(counter) over (Order By ID)
From (
Select ID
,col1
,counter = case when col1='X' then row_number() over (Partition By col1 Order by ID) else null end
From @YourTable
) A
Order By ID
ID Col1 Counter
1 X 1
2 X 2
3 A 2
4 B 2
5 X 3
6 C 3
7 X 4
8 D 4