x
INPUT_FIELD1,INPUT_FIELD2
1,A
2,A
3,A
4,B
5,B
6,A
7,B
8,A
9,B
10,C
11,B
12,B
13,B
14,D
INPUT_FIELD1,INPUT_FIELD2,OUTPUT_FIELD3
1,A,1
2,A,1
3,A,1
4,B,2
5,B,2
6,A,3
7,B,4
8,A,5
9,B,6
10,C,7
11,B,8
12,B,8
13,B,8
14,D,9
I will need the implementation in SQL only and not PL-SQL or any other programming method.
Advertisement
Answer
This is a gaps-and-islands problem. In this case, lag()
and a cumulative sum does what you want:
select t.*,
sum(case when prev_col2 = col1 then 0 else 1 end) over (order by col1) as ranking
from (select t.*,
lag(col2) over (order by col1) as prev_col2
from t
) t