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

Другие вопросы по тегам