SAS Hash join возвращает неожиданные результаты - PullRequest
0 голосов
/ 04 октября 2019

Для проекта на работе мы объединяем два больших набора данных несколько раз. Мы используем хеш-соединение, потому что оно намного быстрее. Недавно мы обнаружили, что иногда HASH-соединение возвращает неправильное значение, но мы не знаем, почему. Сотрудник прошел и изменил имя столбца в HASH, поэтому теперь мы используем другое имя для возвращаемого значения и имя столбца из таблицы HASH (вместо Liab_ILF_Factor = ROUND (LIAB_ILF_Factor, .001) мы используем Liab_ILF_Factor =ROUND (Liab_ILF_Fact, .001), и это, кажется, работает, но просто обеспокоено тем, что это произошло в первую очередь, и хотим убедиться, что мы действительно исправили основную проблему. Что было странным, так это то, что объединение, казалось, правильно соответствовало нескольким изполя (отрасль, штат, весовой класс, тип и т. д.), но вытащил бы ILF, скажем, 1 000 000 вместо 250 000, что и должно было быть.

    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;
...