Для проекта на работе мы объединяем два больших набора данных несколько раз. Мы используем хеш-соединение, потому что оно намного быстрее. Недавно мы обнаружили, что иногда 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;