【问题标题】:Custom Rank Calculation by a percentage range按百分比范围计算自定义排名
【发布时间】:2019-10-29 03:54:07
【问题描述】:

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

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

附件图片仅供参考。

【问题讨论】:

  • 您能否改为包含实际输入 SQL 表的示例?你贴了一张 Excel 的截图,Excel 和 SQL 不是一回事。
  • 你如何定义A公司的回报百分比。你有具体的百分比要考虑吗?
  • 如果你的年化回报率是 0.5%、1%、1.5%、2%、2.5% 等等。您创建了哪些群组?
  • @GordonLinoff 要求是自定义排名需要根据 A 的 % Return 计算。要回答您的问题,如果 A 的回报率为 1.5%,而其他 5 介于(范围在 A 回报的 +1% 和 -1% 之间)0.5% 到 2.5% -> 那么所有公司的自定义排名将为 1/2/ 3/4/5/6 说 B .5% C 1% A 1.5% D 2% E 2.25% F 2.5% 所以正常排名是 F 1 E 2 D 3 A 4 C 5 B 6 在这种情况下 --- 每个人将具有相同的自定义等级 1/2/3/45/6
  • @GordonLinoff 其他场景 说 B .5% C 1% A 1.5% D 2% E 2.25% F 2.75% 所以正常排名是 F 1 E 2 D 3 A 4 C 5 B 6 因为 F不在 A 的 +/- 1% 范围内 --> F 保持它自己的排名 1 ---> 其余时间将是 2/3/4/5/6

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


【解决方案1】:

诀窍是根据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

【讨论】:

猜你喜欢
  • 2019-03-06
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多