有没有一个算法来解决信用评级?

j0pj023g  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(258)

我需要在java或sql中实现以下逻辑。
信用评级从1到11。每个等级对应x,我有3个等级,实际上是x+,x和x-。每个年级之间的差异称为一个台阶。例如,2和2-是单(1)步,2+和2-是双(2)步,2-和3+也是单(1)步。
我的目标是通过编程找出两个信用评级值之间的步数,直到步数的差值为3。
我试图用条件语句(if else/case)来解决这个问题,但更深入的分析得出结论,这需要大约50多条这样的语句,至少在代码布局方面,这不是一件非常有效的事情。
有没有其他方法可以得到步数?也许使用一个临时数据结构,然后使用它进行查找?
注意:我可以将这两个信用评级值从db拉入java代码,然后计算步骤数。或者,我需要创建一个数据库对象(比如procedure、function),然后以这种方式计算步骤数,这样我的java代码就可以直接使用它。

58wvjzkj

58wvjzkj1#

最简单的方法是定义一个包含所有信用评级及其头寸的表:

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() 去拿下一个或上一个——或三步之外的一个。
不过,正如你所描述的那样, number - 1 或者 number + 1 离评分还有三步之遥。

px9o7tmv

px9o7tmv2#

我只需要给每个等级分配一个数值,然后用一个函数从另一个中减去一个。

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。

相关问题