У меня есть старый код SAS, который нужно преобразовать в python.
Часть кода эффективно делает следующее:
data A (index=(key1=(record_id, record_version)));
set table.xxx (where = ...)
run;
data B;
set table.yyy (where = ...)
set A key=key1/unique;
if _ERROR_ = 1 then do;
valueA = "";
_ERROR_ = 0;
end;
run;
Я прочитал документацию по SET и UNIQUE , в которых говорится:
По умолчанию SET начинает поиск в верхней части индекса только при изменении значения KEY =.
Если значение KEY = не меняется при последовательном выполнении оператора SET, поиск начинается с последующего полученного наблюдения. Другими словами, когда появляются последовательные повторяющиеся значения KEY =, оператор SET пытается однозначно сопоставить повторяющиеся индексированные значения в считываемом наборе данных. Если указано больше последовательных повторяющихся значений KEY =, чем существует в считываемом наборе данных, дополнительные дубликаты рассматриваются как не найденные.
Когда KEY = является уникальным значением, только первая попытка чтения наблюдение с этим ключевым значением успешно; последующие попытки прочитать наблюдение с этим значением ключа терпят неудачу. Переменная IOR C возвращает значение, которое соответствует мнемонике c _DSENOM макроса SYSR C autocall. Если вы добавите параметр / UNIQUE, последующие попытки прочитать наблюдение с уникальным значением KEY = будут успешными. Переменная IOR C возвращает 0.
Ха, «последующие попытки прочитать наблюдение с этим значением ключа терпят неудачу». Как потерпеть неудачу?
Итак, практически говоря, даны A и B:
A record_id record_version valueA B record_id record_version valueB
1 1 A11 1 1 B10
1 1 A12 1 2 B20
1 2 A22
1 3 A33
Мой вывод обязательно будет включать следующие строки:
record_id record_version valueA valueB
1 1 A11 B10
1 2 A22 B20
Что я не поймите, что делает оператор if _ERROR_
.
Получу ли я это?
record_id record_version valueA valueB
1 1 B10
Или это?
record_id record_version valueA valueB
1 1 A12 B10
Получу ли я это?
record_id record_version valueA valueB
1 3 A33 null
Или это?
record_id record_version valueA valueB
1 3 null
Какой крайний случай обрабатывает оператор ошибки?