В Base SAS у меня есть скрипт с хеш-объектом для поиска в таблице.Условие как следовать.Таблица A - это исходная первичная таблица, которая будет использовать таблицу B для поиска.Ключ поиска - AssetName и Voltage.Напряжение всегда равно 33 или 11.
Итак, теперь мы можем себе представить, что это поиск в таблице A с помощью таблицы B с использованием AssetName и Voltage для получения некоторых данных из таблицы B.
Позволяет получитьпосмотрите на пример кода, который у меня есть.
data ncpdm.ncp_load_re (drop=excp_code re_state re_supply_zone)
work.excp_ncp_load_re;
length excp_code $50 re_state re_supply_zone $30;
if _n_=1 then do;
declare hash pmu_list(dataset:"ncpdm.ncp_asset_pmu");
pmu_list.definekey('assetname','voltage');
pmu_list.definedata('region','zone','state_code','state',
'business_area_code','business_area',
'supply_zone_code','supply_zone',
'sub_supply_zone_code','sub_supply_zone',
'pmu_name','substation_name_tnbt','functional_location');
pmu_list.definedone();
call missing(region,zone,state_code,state,
business_area_code,business_area,
supply_zone_code,supply_zone,
sub_supply_zone_code,sub_supply_zone,
pmu_name,substation_name_tnbt,functional_location);
end;
set asset_re (RENAME=(pmu=assetname voltage=voltage_));
data_dttm=datetime();
voltage_=strip(voltage_);
voltage=cats('132/',voltage_);
mnemonic_tnbt=strip(mnemonic_tnbt);
assetname=mnemonic_tnbt;
rc=pmu_list.find();
if (rc^=0) then do;
excp_code='Exception: Mnemonic_tnbt and Voltage not mapped to PMU master list';
output work.excp_ncp_load_re;
end;
else do;
output ncpdm.ncp_load_re;
end;
keep mnemonic_tnbt excp_code re_state re_supply_zone
region zone state_code state business_area_code business_area
supply_zone_code supply_zone sub_supply_zone_code sub_supply_zone
pmu_name substation_name_tnbt functional_location voltage
re_state
re_station
re_ca_no
re_customer_name
re_capacity
re_commission_date
re_technology
pmu
ppu
ssu_pe
re_switch_no
voltage
period
data_dttm
active_flag
program
scod_date
kick_off_date
iom_date
geo_longitude
geo_latitude;
run;
Из моего кода выше, я установил те, которые не могут быть сопоставлены / поиск для вывода в таблицу исключений.Затем я использую тот же объектный код хеша, но с excp в качестве источника данных, чтобы снова найти ту же таблицу, код как показано ниже.(Я изменяю Напряжение на 33 или 11 (противоположно существующему напряжению).
/*2nd round lookup for failed record*/
data ncpdm.ncp_load_rev2 (drop=excp_code re_state re_supply_zone)
work.excp_ncp_load_re (drop=excp_code re_state re_supply_zone);
length excp_code $50 re_state re_supply_zone $30;
if _n_=1 then do;
declare hash pmu_list(dataset:"ncpdm.ncp_asset_pmu");
pmu_list.definekey('assetname','voltage');
pmu_list.definedata('region','zone','state_code','state',
'business_area_code','business_area',
'supply_zone_code','supply_zone',
'sub_supply_zone_code','sub_supply_zone',
'pmu_name','substation_name_tnbt','functional_location');
pmu_list.definedone();
call missing(region,zone,state_code,state,
business_area_code,business_area,
supply_zone_code,supply_zone,
sub_supply_zone_code,sub_supply_zone,
pmu_name,substation_name_tnbt,functional_location);
end;
set work.excp_ncp_load_re;
data_dttm=datetime();
if voltage='132/11' then voltage = '132/33';
else if voltage='132/33' then voltage='132/11';
mnemonic_tnbt=strip(mnemonic_tnbt);
assetname=mnemonic_tnbt;
re_state=state;
re_station=station;
re_ca_no=ca_no;
re_customer_name=applicant_name;
re_capacity=capacity;
re_commission_date=commission_date;
re_technology=technology;
geo_latitude=lat;
geo_longitude=lng;
rc=pmu_list.find();
if (rc^=0) then do;
excp_code='Exception: Mnemonic_tnbt and Voltage not mapped to PMU master list';
output work.excp_ncp_load_re;
end;
else do;
output ncpdm.ncp_load_rev2;
end;
keep mnemonic_tnbt excp_code re_state re_supply_zone
region zone state_code state business_area_code business_area
supply_zone_code supply_zone sub_supply_zone_code sub_supply_zone
pmu_name substation_name_tnbt functional_location voltage
re_state
re_station
re_ca_no
re_customer_name
re_capacity
re_commission_date
re_technology
pmu
ppu
ssu_pe
re_switch_no
voltage
period
data_dttm
active_flag
program
scod_date
kick_off_date
iom_date
geo_longitude
geo_latitude;
run;
Проблема в том, что для тех, у кого нет соответствующего Напряжения в моем первом хэш-объекте, мне удалось найти во второмКод хеш-объекта, НО я все еще получаю не отображенные записи. Как только я добавляю таблицу, сгенерированную из 1-го хеш-объекта и 2-го хеш-объекта, я все равно получаю меньше записей, чем желаемый результат.
Я не мог понять, как применитьлучшая логика. Почему-то я чувствую, что мой метод использования 2-го хеш-объекта для поиска не является необходимым, но я просто не знаю, как лучше.
Есть ли лучший способ для этого?