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;

По-прежнему не работает.

Кто-нибудь знает, что я делаю неправильно.


person vinod    schedule 01.11.2013    source источник


Ответы (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 была числовой переменной.

person Joe    schedule 01.11.2013

[Предполагая, что вы используете SAS в Windows - история не будет слишком отличаться в * nix OS] Наибольшее целое число, которое может быть точно представлено в SAS, составляет 9 007 199 254 740 992 или 2 ^ 53 или около 16 цифр - в большинстве случаев номера кредитных карт которые обычно состоят из 15-16 цифр, могут быть сохранены как числовые переменные в SAS. Но, как вы упомянули, у вас есть 20-значное целое число, это приводит к потере точности и преобразованию значения в научную нотацию.

Проблема не в PROC SQL - проблема в меньшем ограничении SAS на представление больших целых чисел. Большинство других баз данных точно представляют до 2 ^ 64. См. документацию SAS

person Community    schedule 01.11.2013