Простой (или упрощенный) подход к вашему окончательному рангу будет следующим:
row_number() over (partition by type order by initrank) +
case type
when 1 then (ceil((row_number() over (partition by type order by initrank))/7)-1)*(10-7)
when 2 then (ceil((row_number() over (partition by type order by initrank))/3)-1)*(10-3)+7
end FinalRank
Это может быть обобщено для более чем 2 групп, например с тремя группами размера 7, 3 и 2,размер шаблона равен 7 + 3 + 2 = 12, общая форма - PartitionedRowNum + (Ceil (PartitionedRowNum / GroupSize) -1) * (PaternSize-GroupSize) + Offset, где смещение является суммой предыдущих размеров групп:
row_number() over (partition by type order by initrank) +
case type
when 1 then (ceil((row_number() over (partition by type order by initrank))/7)-1)*(12-7)
when 2 then (ceil((row_number() over (partition by type order by initrank))/3)-1)*(12-3)+7
when 3 then (ceil((row_number() over (partition by type order by initrank))/2)-1)*(12-2)+7+3
end FinalRank