Sample code to generate rows in oracle using recursive with clause
with ab(cnt) as
(select 2 as cnt from dual
union all
select cnt+2 from ab where cnt<5
)
select * from ab;
Sample code to generate rows in oracle using recursive with clause
with ab(cnt) as
(select 2 as cnt from dual
union all
select cnt+2 from ab where cnt<5
)
select * from ab;
I'm trying to use rank function in sql server with repeating value in the "partition by" clause, but I can't get exactly what I need. This is my query :
select jobID, runStatus,
rank() over (partition by runStatus order by jobID ) as rank
from table
and I get:
jobID runStatus rank 10 s 9 9 s 8 8 s 7 7 s 6 6 s 5 5 s 4 4 f 1 3 s 3 2 s 2 1 s 1
but what I really need is:
jobID runStatus rank desire 10 s 6 9 s 5 8 s 4 7 s 3 6 s 2 5 s 1 4 f 1 3 s 3 2 s 2 1 s 1
meaning that the rank will be initialized every change in runStatus column.
Below is the solution:
You need to define the groups. This is called a "gap-and-islands" problem. And one solution is the difference of row numbers. For your data, this looks like:
select jobID, runStatus,
row_number() over (partition by runStatus, seqnum - seqnum_rs
order by jobID
) as rank
from (select t.*,
row_number() over (order by jobId) as seqnum,
row_number() over (partition by runStatus order by jobId) as seqnum_rs
from t
) t;