按百分比范围自定义排名计算
Custom Rank Calculation by a percentage range
我有计算自定义排名的需求。我需要计算所有 6 家公司的年化百分比 Return。我从他们的 return % 中获得排名。让我们将其视为输入数据。现在我需要计算自定义排名,如果另一家公司的 return 在公司 A 的一个百分点以内,我需要为所有这些公司分配相同的排名(如下图所示)。我有 6 家公司要修复。
所以,简而言之,我的要求是找到哪些公司在公司 A 的一个百分点 return 以内。然后将他们的排名转换为字符串并连接他们的排名;保持其余的排名相同并将其分配给一个新变量。
附图仅供参考。
诀窍是根据Difference from A
的绝对值找到dense_rank()
。差值小于1.0%
,按0
.
处理
-- Sample Table
declare @company table
(
Company char,
AnnualReturns decimal(5,1)
)
-- Sample Data
insert into @company
values ('A', 5.5), ('B', 7.7), ('C', -1.3), ('D', 6.3), ('E', 5.4), ('F', 9.0)
-- The query
; with cte as
(
select *,
[Difference from A] = AnnualReturns - 5.5,
ActualRank = row_number() over (order by AnnualReturns desc),
dr = dense_rank() over (order by case when abs(AnnualReturns - 5.5) <= 1.0
then 0
else abs(AnnualReturns - 5.5)
end)
from @company
)
select Company, AnnualReturns, [Difference from A], ActualRank,
stuff(RequiredRank, 1, 1, '') as RequiredRank
from cte c
cross apply -- concatenate the rank
(
select '/' + convert(varchar(10), ActualRank)
from cte x
where x.dr = c.dr
order by ActualRank
for xml path('')
) rr (RequiredRank)
order by Company
我有计算自定义排名的需求。我需要计算所有 6 家公司的年化百分比 Return。我从他们的 return % 中获得排名。让我们将其视为输入数据。现在我需要计算自定义排名,如果另一家公司的 return 在公司 A 的一个百分点以内,我需要为所有这些公司分配相同的排名(如下图所示)。我有 6 家公司要修复。
所以,简而言之,我的要求是找到哪些公司在公司 A 的一个百分点 return 以内。然后将他们的排名转换为字符串并连接他们的排名;保持其余的排名相同并将其分配给一个新变量。
附图仅供参考。
诀窍是根据Difference from A
的绝对值找到dense_rank()
。差值小于1.0%
,按0
.
-- Sample Table
declare @company table
(
Company char,
AnnualReturns decimal(5,1)
)
-- Sample Data
insert into @company
values ('A', 5.5), ('B', 7.7), ('C', -1.3), ('D', 6.3), ('E', 5.4), ('F', 9.0)
-- The query
; with cte as
(
select *,
[Difference from A] = AnnualReturns - 5.5,
ActualRank = row_number() over (order by AnnualReturns desc),
dr = dense_rank() over (order by case when abs(AnnualReturns - 5.5) <= 1.0
then 0
else abs(AnnualReturns - 5.5)
end)
from @company
)
select Company, AnnualReturns, [Difference from A], ActualRank,
stuff(RequiredRank, 1, 1, '') as RequiredRank
from cte c
cross apply -- concatenate the rank
(
select '/' + convert(varchar(10), ActualRank)
from cte x
where x.dr = c.dr
order by ActualRank
for xml path('')
) rr (RequiredRank)
order by Company