Proc SQL, SAS усекает значение переменной
В моем наборе данных SAS есть столбец с 20-значным идентификатором. Когда я пытаюсь отфильтровать некоторые записи с помощью PROC SQL в SAS EG, поле с идентификатором усекается до 1E18, и экспорт дает мне усеченное значение в каждом поле вместо фактического значения.
Я попытался создать набор данных и определить значение поля, но это не оказало никакого влияния.
Вот мой пример кода
proc sql; create table a01 as select a.id, a.value from b; quit;
data a02;
set a01;
id = put(id,$30.);
run;
Кажется, все еще не работает.
У кого-нибудь есть идеи, что я делаю неправильно.
2 ответа
В то время как Сашикант прав, что SAS (и т. Д.) Не может хранить цифры выше ~15 цифр безопасно (большинство из 16 цифр, но не все), это еще не все. (SAS не имеет истинного понятия "целое число", все числа являются числами с плавающей запятой, следовательно, сохраняют не более 2**53).
data a02;
set a01;
id = put(id,$30.);
run;
Это неправильно использует 30 долларов. формат, который является символьным форматом. В put
тип формата определяется первым аргументом, а не результирующим типом (который всегда является символом - put
генерирует персонажей, input
генерирует числа). Так $30.
будет уместно только если id
были символьной переменной. Поскольку кажется, что это числовая переменная, она должна быть:
id2 = put(id,30.);
Обратите внимание, что это id2
на левой стороне - вы не можете преобразовать числовое значение id
к характеру id
на одном и том же шаге данных они должны иметь разные имена.
Также возможно, что ваш номер был заранее преобразован в 1E18 (например, в Excel, если он прошел через него - Excel также не мог точно сохранить этот номер); шаг данных, который вы опубликовали, должен был выдать несколько предупреждений о преобразовании чисел в / из чисел, если id
была числовая переменная.
[Предполагается, что вы используете SAS в Windows - история не будет слишком отличаться в *nix OS] Самое большое целое число, которое может быть точно представлено в SAS, составляет 9 007 199254 740 992 или 2^53 или около 16 цифр - в большинстве случаев номера кредитных карт которые обычно имеют длину 15-16 цифр, могут быть сохранены как числовые переменные в SAS. Но, как вы упоминаете, у вас есть 20-значное целое число, это приводит к тому, что значение теряет некоторую точность и преобразуется в научную нотацию.
Проблема не в PROC SQL, а в том, что SAS ограничивает представление больших целых чисел. Большинство других баз данных будут отображать до 2^64 точно. Смотрите документацию SAS