在我的表格中,我有4列ID,分别键入InitialRanking和FinalRanking。根据某些条件,我设法将InitialRanking应用于记录(1-20)。现在,我需要通过确定类型1的前7位,然后是
来应用FinalRanking
类型2的前3个。然后,我需要重复上述操作,直到所有记录都具有FinalRanking。我的目标是在所附图像的最后一栏中实现输出。
7和3会随时间而变化,但就本示例而言,我们假设它们是固定的。
答案 0 :(得分:0)
您可以尝试这样
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))
)
)
答案 1 :(得分:0)
一种简单(或简单化)的最终排名方法是:
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
这可以概括为两个以上的组,例如具有大小为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