Sql (强制转换(“/0/1/0/0/1/”作为hierarchyid),NULL,NULL,45.97), (cast(“/0/1/0/1/”作为hierarchyid),NULL,NULL,42.26); 去 创建函数dbo.findvalfrom( @h等

Sql (强制转换(“/0/1/0/0/1/”作为hierarchyid),NULL,NULL,45.97), (cast(“/0/1/0/1/”作为hierarchyid),NULL,NULL,42.26); 去 创建函数dbo.findvalfrom( @h等,sql,sql-server,design-patterns,weka,Sql,Sql Server,Design Patterns,Weka,(强制转换(“/0/1/0/0/1/”作为hierarchyid),NULL,NULL,45.97), (cast(“/0/1/0/1/”作为hierarchyid),NULL,NULL,42.26); 去 创建函数dbo.findvalfrom( @h等级制, @val_为十进制(10,4), @十进制值(10,4), @十进制值(10,4), @十进制值(10,4), @十进制值(10,4) )返回十进制(10,4)作为开始 声明@c字符; 声明@s十进制数(10,4); 声明@v十进制(1

(强制转换(“/0/1/0/0/1/”作为hierarchyid),NULL,NULL,45.97), (cast(“/0/1/0/1/”作为hierarchyid),NULL,NULL,42.26); 去 创建函数dbo.findvalfrom( @h等级制, @val_为十进制(10,4), @十进制值(10,4), @十进制值(10,4), @十进制值(10,4), @十进制值(10,4) )返回十进制(10,4)作为开始 声明@c字符; 声明@s十进制数(10,4); 声明@v十进制(10,4); 选择 @c=fac,@s=split,@v=val 根据决定 你在哪里找到了=@h 如果@v不为空,则返回@v; 声明@val十进制(10,4); 将@val=case设置为@c='a',然后设置为@val\u a 当@c='b'然后@val_b 当@c='c'然后@val_c 当@c='d'然后@val\d 当@c='e'时,则@val_e结束;
设置@h=cast(@h.ToString()+case when@valBTW,很抱歉没有对我如何组织规则表以及函数如何工作进行评论。如果需要,可以询问。我发布了一个后续问题,询问如何在此处自动生成
插入决策值
SQL代码:。可能您没有将终止符设置为
GO
(如果它能自动为SQL Server执行此操作,那就太好了)终结者设置是个问题,Martin。感谢SQL小提琴提示和发布链接。我的好朋友伊齐克·本·甘提出了一些建议。(字符串代替hierarchyid,循环代替递归。他还指出MAXRECURSION不适用于我遇到的情况。)我在这里发布了他的解决方案:顺便说一句,很抱歉没有对我如何组织规则表以及函数如何工作发表评论。如果需要,请提问。我在这里发布了一个后续问题,询问如何自动生成
插入决策值
SQL代码:。可能您没有将终止符设置为
GO
(如果它能自动为SQL Server执行此操作,那就太好了)终结者设置是个问题,Martin。感谢SQL小提琴提示和发布链接。我的好朋友伊齐克·本·甘提出了一些建议。(字符串代替hierarchyid,循环代替递归。他还指出MAXRECURSION不适用于我遇到的情况。)我在这里发布了他的解决方案:
fac_a < 64
|   fac_d < 71.5
|   |   fac_a < 49.5
|   |   |   fac_d < 23.5 : 19.44 (13/43.71) [13/77.47]
|   |   |   fac_d >= 23.5 : 24.25 (32/23.65) [16/49.15]
|   |   fac_a >= 49.5 : 30.8 (10/17.68) [5/22.44]
|   fac_d >= 71.5 : 33.6 (25/53.05) [15/47.35]
fac_a >= 64
|   fac_d < 83.5
|   |   fac_a < 91
|   |   |   fac_e < 93.5
|   |   |   |   fac_d < 45 : 31.9 (16/23.25) [3/64.14]
|   |   |   |   fac_d >= 45
|   |   |   |   |   fac_e < 21.5 : 44.1 (5/16.58) [2/21.39]
|   |   |   |   |   fac_e >= 21.5
|   |   |   |   |   |   fac_a < 77.5 : 33.45 (4/2.89) [1/0.03]
|   |   |   |   |   |   fac_a >= 77.5 : 39.46 (7/10.21) [1/11.69]
|   |   |   fac_e >= 93.5 : 45.97 (2/8.03) [1/107.71]
|   |   fac_a >= 91 : 42.26 (9/9.57) [4/69.03]
|   fac_d >= 83.5 : 47.1 (9/30.24) [6/40.15]
-- Rule 1
UPDATE table_name
SET prediction=value1
WHERE 
    fac_a < 64 AND 
    fac_d < 71.5 AND 
    fac_a < 49.5 AND 
    fac_d < 23.5
;

-- Rule 2
UPDATE table_name
SET prediction=value2
WHERE 
    fac_a < 64 AND 
    fac_d < 71.5 AND 
    fac_a < 49.5 AND 
    fac_d >= 23.5
;

etc. for each rule
create table facdata (
  fac_a decimal(10,4),
  fac_b decimal(10,4),
  fac_c decimal(10,4),
  fac_d decimal(10,4),
  fac_e decimal(10,4),
  val   decimal(10,4)
);

with v(i) as (
  select 40 union all select 50 union all select 70
  union all select 80 union all select 90 union all select 100
)
insert facdata
  select a.i, 30, c.i, d.i, e.i, null
  from v as a, v as c, v as d, v as e
go

create table decisions (
  did hierarchyid primary key,
  fac char,
  split decimal(10,4),
  val decimal(10,4)
)

insert decisions values
  (cast('/0/' as hierarchyid), 'a', 64,null),
  (cast('/0/0/' as hierarchyid), 'd', 71.5,null),
  (cast('/0/0/0/' as hierarchyid), 'a', 49.5,null),
  (cast('/0/0/0/0/' as hierarchyid), 'd', 23.5,null),
  (cast('/0/0/0/0/0/' as hierarchyid), NULL, NULL,19.44),
  (cast('/0/0/0/0/1/' as hierarchyid), NULL, NULL, 24.25),
  (cast('/0/0/0/1/' as hierarchyid), NULL, NULL, 30.8),
  (cast('/0/0/1/' as hierarchyid), NULL, NULL, 33.6),
  (cast('/0/1/' as hierarchyid), 'd', 83.5,null),
  (cast('/0/1/0/' as hierarchyid), 'a', 91,null),
  (cast('/0/1/1/' as hierarchyid), NULL, NULL, 47.1),
  (cast('/0/1/0/0/' as hierarchyid), 'e', 93.5,null),
  (cast('/0/1/0/0/0/' as hierarchyid), 'd', 45,null),
  (cast('/0/1/0/0/0/0/' as hierarchyid), null,null,31.9),
  (cast('/0/1/0/0/0/1/' as hierarchyid), 'e', 21.5,null),
  (cast('/0/1/0/0/0/1/0/' as hierarchyid), null,null,44.1),
  (cast('/0/1/0/0/0/1/1/' as hierarchyid), 'a', 77.5,null),
  (cast('/0/1/0/0/0/1/1/0/' as hierarchyid), NULL,NULL,33.45),
  (cast('/0/1/0/0/0/1/1/1/' as hierarchyid), NULL,NULL,39.46),
  (cast('/0/1/0/0/1/' as hierarchyid), NULL,NULL,45.97),
  (cast('/0/1/0/1/' as hierarchyid), NULL,NULL, 42.26);
go

create function dbo.findvalfrom(
  @h hierarchyid,
  @val_a decimal(10,4),
  @val_b decimal(10,4),
  @val_c decimal(10,4),
  @val_d decimal(10,4),
  @val_e decimal(10,4)
) returns decimal(10,4) as begin
    declare @c char;
    declare @s decimal(10,4);
    declare @v decimal(10,4);
    select
      @c = fac, @s = split, @v = val
    from decisions
    where did = @h
    if @v is not null return @v;

    declare @val decimal(10,4);
    set @val = case when @c='a' then @val_a
                    when @c='b' then @val_b
                    when @c='c' then @val_c
                    when @c='d' then @val_d
                    when @c='e' then @val_e end;

    set @h = cast (@h.ToString()+case when @val<@s then '0/' else '1/' end as hierarchyid);
    return dbo.findvalfrom(@h,@val_a,@val_b,@val_c,@val_d,@val_e);
  end;
go


update facdata set
  val = dbo.findvalfrom('/0/',fac_a,fac_b,fac_c,fac_d,fac_e);
go

select * from facdata;