SQL ранжирует N записей по одному критерию и N записей по другому и повторяет - PullRequest
0 голосов
/ 27 декабря 2018

В моей таблице 4 идентификатора столбца, введите InitialRanking и FinalRanking.На основании определенных критериев мне удалось применить InitialRanking к записям (1-20).Теперь мне нужно применить FinalRanking, идентифицировав верхние 7 типа 1, за которыми следуют

enter image description here

верхние 3 типа 2. Затем мне нужно повторить вышеописанное, пока все записи не будут иметьFinalRanking.Моей целью было бы добиться вывода в последнем столбце прикрепленного изображения.

7 и 3 будут меняться со временем, но для целей этого примера, скажем, они исправлены.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Простой (или упрощенный) подход к вашему окончательному рангу будет следующим:

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
0 голосов
/ 27 декабря 2018

вы можете попробовать вот так

       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))

                )
         )
...