Hash SAS哈希联接返回意外结果

Hash SAS哈希联接返回意外结果,hash,sas,Hash,Sas,对于正在工作的项目,我们多次将两个大型数据集连接在一起。我们使用散列联接,因为它要快得多。最近我们发现哈希连接偶尔返回错误的值,但我们真的不知道为什么。一位同事检查并更改了哈希表中的列名,因此我们现在对返回值和哈希表中的列名使用不同的名称(而不是Liab_ILF_Factor=ROUND(Liab_ILF_Factor.001),我们使用Liab_ILF_Factor=ROUND(Liab_ILF_Factor.001)这似乎是可行的,但只是担心它一开始就发生了,我们想确保我们已经解决了根本问题

对于正在工作的项目,我们多次将两个大型数据集连接在一起。我们使用散列联接,因为它要快得多。最近我们发现哈希连接偶尔返回错误的值,但我们真的不知道为什么。一位同事检查并更改了哈希表中的列名,因此我们现在对返回值和哈希表中的列名使用不同的名称(而不是Liab_ILF_Factor=ROUND(Liab_ILF_Factor.001),我们使用Liab_ILF_Factor=ROUND(Liab_ILF_Factor.001)这似乎是可行的,但只是担心它一开始就发生了,我们想确保我们已经解决了根本问题。奇怪的是,连接似乎正确地匹配了几个字段(行业、州、权重类、类型等)但它会以1000000英镑而不是250000英镑的价格提取ILF,而这正是它应该提取的

    data liabumuimilffactor (drop=liabumuimilf_factors_dte_key liabumuimilf_factor_state_join veh_wgt_class industry Limit ILF_Bucket Eff_dt Exp_Dt Created_Dt state dte_key
                                  LIAB_ILF_Fact UM_UIM_ILF_Fact PIP_ILF_Fact);
        if 0 Then Set ilf_input Liab_UM_UIM_ILF_Factor;

        if _N_ = 1 then do;
            Declare Hash ILF_Factor_Hash(Dataset:"Liab_UM_UIM_ILF_Factor");         
            ILF_Factor_Hash.DefineKey('state', 'dte_key', 'Veh_Type', 'Veh_Wgt_Class', 'Industry', 'Limit');
            ILF_Factor_Hash.DefineData('ILF_Bucket', 'LIAB_ILF_Fact', 'UM_UIM_ILF_Fact', 'PIP_ILF_Fact');           
            ILF_Factor_Hash.DefineDone();
        end;

        set ilf_input;
        if ILF_Factor_Hash.Find(Key:liabumuimilf_factor_state_join, Key:liabumuimilf_factors_dte_key, Key:Veh_Type, Key:Veh_Wgt_Class_Mapped, Key:IndustryGroup, Key:Liab_Limit) = 0 then do;
            Liab_ILF_Factor = round(LIAB_ILF_Fact, .001);
            Liab_ILF_Bucket = ILF_Bucket;                       
        end;
        else do;
            Liab_ILF_Factor = .;
            Liab_ILF_Bucket = "";
        end;

        if ILF_Factor_Hash.Find(Key:liabumuimilf_factor_state_join, Key:liabumuimilf_factors_dte_key, Key:Veh_Type, Key:Veh_Wgt_Class_Mapped, Key:IndustryGroup, Key:UM_UIM_Limit) = 0 then do;
            UM_UIM_ILF_Factor = round(UM_UIM_ILF_Fact, .001);
            UM_UIM_ILF_Bucket = ILF_Bucket;
        end;
        else do;
            UM_UIM_ILF_Factor = .;
            UM_UIM_ILF_Bucket = "";
        end;

        if ILF_Factor_Hash.Find(Key:liabumuimilf_factor_state_join, Key:liabumuimilf_factors_dte_key, Key:Veh_Type, Key:Veh_Wgt_Class_Mapped, Key:IndustryGroup, Key:PIP_Limit) = 0 then do;
            PIP_ILF_Factor = round(PIP_ILF_Fact, .001);
            PIP_ILF_Bucket = ILF_Bucket;
        end;
        else do;
            PIP_ILF_Factor = .;
            PIP_ILF_Bucket = "";
        end;
    run;

Liab_UM_UIM_ILF_Factor
填充
ILF_Factor_Hash
似乎有点奇怪。当“Limit”键项选择要“使用”的数据项时,为什么要将这三个事实都存储为数据项?这就像是在那个细节级别执行3x3矩阵,并将值存储在对角线上以供检索。为什么不存储一个事实值(而不是一个值和两个不适用的)每个限制值?如果我理解你的问题-我们对每个限制有不同的因素的原因是不同的“保险范围”有不同的因子。我们可以将覆盖率作为一个额外的键,然后如果有一些性能增强,则每行有一个因子。我们从不同的源中提取因子表,操作越少越好。