我需要在Java或SQL中实现以下逻辑。
有从数字1到11的信用评级。每个评级对应于x,我有3个等级,有效地:x+,x和x-。每个等级之间的差异被称为一个步骤。例如,2和2-是单(1) step,2+,2-是双(2)步,2-和3+也是单(1)步。
我的目标是以编程方式找出两个信用评级值之间的步数,直到步数之差为3。
我试图使用条件语句(if-else/case)来解决这个问题,但更深入的分析得出的结论是,这将需要大约50个这样的语句,这不是一个非常有效的事情,至少在代码布局方面是这样。
有没有其他方法可以得到步数?也许使用临时数据结构,然后使用它进行查找?
注意:我可以将两个信用评级值从DB拉到Java Code中,然后计算步骤数。或者,我需要创建一个数据库对象(如procedure、function),然后以这种方式计算步骤数,以便我的Java代码可以直接使用它。
发布于 2020-12-18 00:38:02
我只会给每个评分分配一个数值,并有一个函数将一个从另一个中减去。
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。
发布于 2020-12-16 15:24:37
最简单的方法是定义一个表,其中包含所有信用评级及其位置:
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 - 1
或number + 1
在三步之外获得评级。
https://stackoverflow.com/questions/65325671
复制