Примерно так и должно быть, исходя из минимальных требований, которые вы перечислили:
;with NumberedRows as (
select
*, --TODO - pick columns
ROW_NUMBER() OVER(PARTITION BY status ORDER BY PKID) - 1 as rn
from
table
), AlteredOrdering as (
select
*, --TODO - pick columns
CASE
WHEN status = 'active' THEN (10 * (rn/7)) + (rn % 7)
WHEN status = 'inactive' THEN (10 * (rn/3)) + 7 + (rn % 3)
END as FinalOrder
from NumberedRows
)
select * from AlteredOrdering ORDER BY FinalOrder
Очевидно, изменив имена таблиц и столбцов в зависимости от ситуации. PKID
предполагается, что это какой-то другой столбец в таблице, по которому можно упорядочить отдельные строки.
Магические числа в CTE AlteredOrdering, как мы надеемся, очевидны - 7 и 3 взяты из вопроса и представляют, сколько каждого элемента должно появиться в каждой «группе». 10 - это общий размер каждой «группы». Таким образом, если бы это было 9 активных, 4 неактивных, выражение CASE выглядело бы так:
WHEN status = 'active' THEN (13 * (rn/9)) + (rn % 9)
WHEN status = 'inactive' THEN (13 * (rn/4)) + 9 + (rn % 4)