SQL ранжирует N записей по одному критерию и N записей по другому и повторяет
В моей таблице у меня есть 4 столбца Id, Type InitialRanking и FinalRanking. На основании определенных критериев мне удалось применить InitialRanking к записям (1-20). Теперь мне нужно применить FinalRanking, определив 7 лучших типов 1, а затем
топ 3 типа 2. Затем мне нужно повторить выше, пока все записи не имеют FinalRanking. Моей целью было бы добиться вывода в последнем столбце прикрепленного изображения.
7 и 3 будут меняться со временем, но для целей этого примера, скажем, они исправлены.
2 ответа
Ты можешь попробовать вот так
SELECT * FROM(
( SELECT ID,DISTINCT TYPE,
CASE WHEN TYPE=1 THEN
( SELECT TOP 7 INITIALRANK, FINALRANK
from table where type=1)
ELSE
( SELECT TOP 3 INITIALRANK, FINALRANK
from table where type=2)
END CASE
FROM TABLE WHERE TYPE IN (1,2)
)
UNION
( SELECT ID,TYPE,
INITIALRANK, FINALRANK
from table where type not in (1,2))
)
)
Простой (или упрощенный) подход к вашему окончательному рангу будет следующим:
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