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
Другие вопросы по тегам