【问题标题】:Is there a algorithm to resolve credit rating?是否有解决信用评级的算法?
【发布时间】:2021-03-27 06:08:50
【问题描述】:

我需要在 Java 或 SQL 中实现以下逻辑。

信用评级从数字 1 到 11。 并且对应于每个等级说 x,我有 3 个等级,有效地:x+、x 和 x-。 每个等级之间的差异称为一个步骤。例如,2 和 2- 是单 (1) 步,2+ 和 2- 是双 (2) 步,而 2- 和 3+ 又是单 (1) 步。

我的目标是以编程方式找出两个信用评级值之间的步数,直到步数差为 3。

我尝试使用条件(if-else/case)语句来解决这个问题,但更深入的分析得出的结论是,这将需要大约 50 多个这样的语句,这至少不是一件非常有效的事情在代码布局方面。

还有其他方法可以获取步数吗?也许使用临时数据结构,然后使用它进行查找?

注意:我可以将两个信用等级值从数据库中提取到 Java 代码中,然后计算步数。 或者,我需要创建一个数据库对象(如过程、函数),然后以这种方式计算步骤数,以便我的 Java 代码可以直接使用它。

【问题讨论】:

  • 看起来给定评级 NNN*3 - 1N-N*3 -2N+N*3。从那里计算两个评级之间的步骤是微不足道的。
  • @FedericoklezCulloca,我认为这种方法并不总是有效,例如 7- 和 8。使用上述方法给我 (7*3)-2=19 和 (8*3)-1 =23.这两个值的差是4.而它们之间的步数只有2(7-,8+,8)
  • 糟糕,我以为订单是N-<N<N+。如果您移动计算以使其按您想要的顺序运行。
  • 请提供样本数据和期望的结果。
  • @GordonLinoff ,以下是示例数据:信用评级 1 和 2 是我的输入,步骤是我的输出。在说明字段中,每个“=>”表示一个步骤。 imgur.com/a/JP72Vdz

标签: java sql arrays plsql


【解决方案1】:

最简单的方法是定义一个表,其中包含所有信用等级及其位置:

create table creditratings as
    select 1 as ord, 1 as number, '-' as grade from dual union all
    select 2 as ord, 1 as number, ' ' as grade from dual union all
    select 3 as ord, 1 as number, '+' as grade from dual union all
    . . .

那么对于任何信用评级,您可以使用lead()lag() 来获得下一个或上一个 - 或 3 步之外的一个。

不过,正如您所描述的问题,number - 1number + 1 距离评级只有三步之遥。

【讨论】:

    【解决方案2】:

    我只会为每个评分分配一个数值,并有一个函数可以从另一个评分中减去一个。

    create or replace package rating
    as
        function diff(r1 varchar2, r2 varchar2)
            return integer
            deterministic
            parallel_enable;
    end rating;
    /
    
    create or replace package body rating
    as
        type rating_tab is table of simple_integer index by varchar2(3);
        ratings rating_tab;
    
        function diff(r1 varchar2, r2 varchar2)
            return integer
            deterministic
            parallel_enable
        is
            pragma udf;
        begin
            return ratings(r2) - ratings(r1);
        end diff;
    
    begin
        ratings('1+')  := 1;
        ratings('1+')  := 2;
        ratings('1')   := 3;
        ratings('1-')  := 4;
        ratings('2+')  := 5;
        ratings('2')   := 6;
        ratings('2-')  := 7;
        ratings('3+')  := 8;
        ratings('3')   := 9;
        ratings('3-')  := 10;
        ratings('4+')  := 11;
        ratings('4')   := 12;
        ratings('4-')  := 14;
        ratings('5+')  := 15;
        ratings('5')   := 16;
        ratings('5-')  := 17;
        ratings('6+')  := 18;
        ratings('6')   := 19;
        ratings('6-')  := 20;
        ratings('7+')  := 21;
        ratings('7')   := 22;
        ratings('7-')  := 23;
        ratings('8+')  := 24;
        ratings('8')   := 25;
        ratings('8-')  := 26;
        ratings('9+')  := 27;
        ratings('9')   := 28;
        ratings('9-')  := 29;
        ratings('10+') := 30;
        ratings('10')  := 31;
        ratings('10-') := 32;
        ratings('11+') := 33;
        ratings('11')  := 34;
        ratings('11-') := 35;
    end rating;
    /
    
    select rating.diff('1-', '3+') as steps from dual;
    
        STEPS
    ---------
            4
    

    我不确定 PL/SQL 函数是否可以接受,因为您一开始就说您想使用 Java 或 SQL。

    【讨论】:

      猜你喜欢
      • 2017-11-19
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 2023-03-23
      • 2014-05-03
      • 1970-01-01
      • 2019-03-30
      相关资源
      最近更新 更多