Когда другая команда генерирует вывод из Dictionary_columns, и я фильтрую по type = "num": точность и масштаб имеют только 1 значение во всех столбцах; «0» и «.» соответственно. И это несмотря на то, что существуют десятки, если не сотни [точность 16, десятичное число 4] и [точность 16 и десятичное число 2], что подтверждается экспортом данных. Кроме того, 100% столбцов type = num имеют [length]= 8.
Я просмотрел вывод dicationary_columns и всевозможных страниц поддержки SAS. Я бы ожидал чего-то вроде того, как
Обновленный запрос
Я понимаю, что это будет просто снимок, и будущие значения могут переполниться, но это даст администраторам баз данных шанс на борьбу: макрос sas, который, учитывая библиотеку = X, для каждой таблицы, для каждого столбца, выдает следующие атрибуты (equivalent sql provided
)
max( len( rtrim( sasVariable))
sign( min( sasVariabe))/*only needed if rdbms supports unsigned int*/
/*length of integer portion only */ max( convert( bigint, abs( sasVariable)))
)/*maximum length of the number of decimal digits after removing all trailing 0s*/ max( case when sign( abs(isNull(vwValues.value, 0) % 1)) = 0 then 0 else len( rtrim( replace( replace( convert( varchar(1000), abs(vwValues.value % 1)), '.', ''), '0', char(32)))) -1 end)/*note: sasVariable % 1 : starts with modulus portion only*/
Я использую собственные условия SAS. Вы не согласны с тем, что Dictionary_columns имеет атрибуты точности и масштаба? см.: google.com/…
Я не вижу ни одного из этих терминов в статье Кирка Пола Лафлера, на которую вы ссылаетесь.
внизу страницы 4 - плохо отформатировано. его изображение и линия обтекает.
Эти переменные не заполняются для наборов данных SAS. Они могут быть заполнены, если метаданные поступают из запроса внешней базы данных, с которой вы связали сеанс SAS.
SAS — это не база данных. Однако возможно, что кто-то использует форматы для реализации этих концепций в наборах данных SAS. Формат 8.2 будет означать точность 8, масштаб 2.
SAS имеет два типа переменных. Строки символов фиксированной длины и 64-битные двоичные числа с плавающей запятой.
ДЛИНА переменной — это количество байтов, которое она использует для хранения значения в наборе данных. Для символьной переменной, которая будет соответствовать количеству символов при использовании однобайтовой кодировки. Для числовой переменной это то, сколько из 8 байтов, необходимых для хранения 64-битного числа, вы хотите сохранить. Когда значение извлекается из набора данных, остальные байты устанавливаются в двоичные нули. Чтобы увидеть, как это влияет на максимальное целое число, которое SAS может хранить точно, вы можете использовать функцию CONSTANT() с константой EXACTINT.
Итак, на машине, использующей формат IEEE для плавающей запятой, вы получаете:
1487 data _null_;
1488 do bytes=3 to 8;
1489 int=constant('exactint',bytes);
1490 put bytes int comma23. ;
1491 end;
1492 run;
3 8,192
4 2,097,152
5 536,870,912
6 137,438,953,472
7 35,184,372,088,832
8 9,007,199,254,740,992
Значения будут другими, если вы работаете на мэйнфрейме IBM, поскольку эта машина использует другое представление с плавающей запятой.
Возможно, вы можете оценить типы сохраняемых чисел на основе того, решил ли создатель набора данных прикрепить к переменной определенный формат отображения. Ширина формата отображения — это количество байтов, используемых для его отображения. Таким образом, это будет включать пробел для всех цифр до и после десятичной точки, а также для десятичной точки, если это необходимо (и при использовании такого формата, как ЗАПЯТАЯ, ДОЛЛАР или ПРОЦЕНТ, тогда также пробел, например, отображаются другие символы). Значение после точки в определении формата — это количество отображаемых десятичных разрядов. Таким образом, формат 8.3
будет записывать 4 цифры, десятичную точку, а затем еще 3 цифры, всего 8 байтов. Таким образом, используя ваше определение ТОЧНОСТИ и МАСШТАБА, вы должны оценить МАСШТАБ как количество знаков после запятой (значение переменной FORMATD, созданное PROC CONTENTS), а ТОЧНОСТЬ как ширину формата (переменная FORMATL) или ширину минус один в зависимости от от того, равно ли количество десятичных разрядов нулю или нет.
Обратите внимание, что формат используется только для отображения значений, поэтому он не меняет способ их хранения.
Если вы хотите увидеть ТОЧНОСТЬ и МАСШТАБ для возможных значений нормального числового формата (на который можно ссылаться с помощью псевдонима F), вы можете запустить эту программу и распечатать результирующий набор данных.
data decimal;
length formatspec $40 format $32 formatl formatd precision scale 8;
format='F';
do formatl=1 to 17 ;
do formatd=0 to max(0,formatl-2);
formatspec=cats(format,formatl,'.');
if formatd then formatspec=cats(formatspec,formatd);
scale=formatd ;
precision = formatl;
if formatd then precision=precision-1;
if precision < 17 then output;
end;
end;
run;
Вы можете выполнить аналогичные расчеты для форматов COMMA и DOLLAR, но включить дополнительные вычитания из PRECISION в зависимости от того, сколько дополнительных символов будет напечатано в этих форматах. Таким образом, DOLLAR13.2 (пример отображаемого значения $1,234,567.89
) будет иметь ТОЧНОСТЬ 9 и МАСШТАБ 2, поскольку в общей ширине 13 символов учитывается 4 знака препинания.
Если ваши значения могут быть отрицательными, то при преобразовании из PRECISION и SCALE в формат отображения SAS вам, вероятно, потребуется добавить единицу к ширине отображения, чтобы учесть отрицательный знак.
с оператором SAS create table вы не можете объявить переменную с точностью X и масштабировать Y таким образом, чтобы попытка вставки/обновления чисел с цифрами длиннее X цифр и/или десятичных знаков длиннее Y цифр приводила к ошибкам?
если вам нужно перенести набор данных SAS в систему реляционной базы данных, как бы вы определили, какие числовые переменные sas нуждаются в числовых (16,2), против битовых, против целых и т. д. и т. д.?
Точно так же, как вы строите любую базу данных, спрашивая владельцев данных, что это за данные. Вероятно, есть документы, похожие на ту, на которую вы ссылаетесь, которые показывают методы SAS для запроса данных и делают обоснованные предположения о том, что это значит, на основе того, что в них содержится. Например, сколько различных значений имеет переменная? Какова «мощность» переменной? Имеет ли каждое наблюдение отдельное значение, тогда, возможно, переменная является КЛЮЧЕВОЙ.
Я никогда не использовал SAS, поэтому я полагаюсь на вашу оценку репутации, но я ошеломлен тем, что SAS не предоставляет способа программно определять, применять и сообщать о точности/масштабе числовых переменных. У команды выше по течению есть сотни таблиц с тысячами столбцов — ручное документирование нюансов типов данных просто не масштабируется; Я буду сталкиваться с проблемами каждый раз, когда мы импортируем их данные. Думаю, я просто сделаю каждое число числом с плавающей запятой? это кажется безумием.
SAS не является системой баз данных. Это система анализа. Вы можете связать SAS с системами реляционных баз данных, если этого требуют ваши данные.
Если у них есть данные, которые описывают данные, вы можете легко использовать их для проведения анализа и даже для создания кода, необходимого для проведения анализа.
Я ценю ваши ответы, просто жаль, что они не решают мою проблему. В конце концов я отмечу это как ответ, если никто другой не предоставит что-то более близкое к тому, что мне нужно. Еще один разглагольствования SAS: почему словарь.columns.precision и Dictionary.columns.scale существуют, если они никогда не заполняются? Или если их можно заселить, то как?
Потому что вы можете подключиться к БД, которая имеет точность/масштаб, и в этом случае вы хотите, чтобы таблицы словаря отображали эту информацию.
SAS предлагает интерфейсы для многих СУБД, которые называются SAS/ACCESS Interface to <name of RDBMS>
. При создании таблиц базы данных из наборов данных SAS эти интерфейсы обычно используют комбинацию типа данных SAS (числового и символьного) и формата, применяемого к переменной SAS. Например, я работаю в основном с базой данных Teradata. В документации по Teradata есть таблица, в которой показано, какие типы данных используются с определенными форматами SAS при создании таблиц Teradata из наборов данных SAS.
Обратите внимание на последнюю запись в таблице. Если числовая переменная имеет какой-либо другой формат или не имеет формата, то типом данных по умолчанию является число с плавающей запятой, которое будет захватывать значение, но, вероятно, не будет самым эффективным вариантом хранения.
По моему опыту, большинство аналитиков не тратят время на определение форматов для каждой переменной, если только набор данных не используется интенсивно или к нему обращаются неоднократно. Эта информация может не сильно вам помочь.
Пожалуйста, определите ваши термины. SAS имеет два типа переменных: строки символов фиксированной длины и числа с плавающей запятой. Где вы ожидаете найти «точность» и «масштаб»? У вас есть какие-то внешние метаданные о переменных, в которых они хранятся?