自定义排名计算(按百分比范围)

时间:2019-10-29 03:54:07

标签: sql sql-server azure-sql-database azure-sql-server

我有计算自定义排名的要求。我需要计算所有6家公司的年化回报率。我从他们的回报百分比获得排名。让我们将其视为输入数据。现在,我需要计算自定义排名,如果另一家公司的回报率在公司A的一个百分点之内,则需要为所有这些公司分配相同的排名(如下图所示)。我有6个将要修复的公司。

因此,简而言之,我的要求是找出哪些公司在公司A的回报率的一个百分点之内。然后将其排名转换为字符串并连接其排名;保持其余等级不变,并将其分配给新变量。

enter image description here

附加的图像仅供参考。

1 个答案:

答案 0 :(得分:2)

诀窍是根据dense_rank()的绝对值找到Difference from A。对于小于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