SAS, где получить точность/масштаб для всех столбцов «num», в которых хранятся десятичные данные?

Когда другая команда генерирует вывод из Dictionary_columns, и я фильтрую по type = "num": точность и масштаб имеют только 1 значение во всех столбцах; «0» и «.» соответственно. И это несмотря на то, что существуют десятки, если не сотни [точность 16, десятичное число 4] и [точность 16 и десятичное число 2], что подтверждается экспортом данных. Кроме того, 100% столбцов type = num имеют [length]= 8.

Я просмотрел вывод dicationary_columns и всевозможных страниц поддержки SAS. Я бы ожидал чего-то вроде того, как

  • экспортировать словарь данных с полной и точной информацией о типах данных
  • экспортировать операторы создания таблиц для всех существующих таблиц с полной и точной информацией о типах данных

Обновленный запрос Я понимаю, что это будет просто снимок, и будущие значения могут переполниться, но это даст администраторам баз данных шанс на борьбу: макрос sas, который, учитывая библиотеку = X, для каждой таблицы, для каждого столбца, выдает следующие атрибуты (equivalent sql provided)

  • имя sasTable
  • имя sasVariable
  • Тип sas (символ против числа)
  • charLength: Null, если Type равно num, иначе максимальная длина символа: max( len( rtrim( sasVariable))
  • lowSign: Null, если Type — char, иначе: sign( min( sasVariabe))/*only needed if rdbms supports unsigned int*/
  • maxIntegerPrecision: Null, если Type — char, иначе: /*length of integer portion only */ max( convert( bigint, abs( sasVariable))))
  • maxDecimalScale: null, если Type — char, иначе: /*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*/
  • тогда конечному пользователю необходимо добавить maxIntegerPrecision + maxDecimalScale, чтобы получить фактическую точность

Пожалуйста, определите ваши термины. SAS имеет два типа переменных: строки символов фиксированной длины и числа с плавающей запятой. Где вы ожидаете найти «точность» и «масштаб»? У вас есть какие-то внешние метаданные о переменных, в которых они хранятся?

Tom 14.02.2023 17:06

Я использую собственные условия SAS. Вы не согласны с тем, что Dictionary_columns имеет атрибуты точности и масштаба? см.: google.com/…

spioter 14.02.2023 17:13

Я не вижу ни одного из этих терминов в статье Кирка Пола Лафлера, на которую вы ссылаетесь.

Tom 14.02.2023 17:18

внизу страницы 4 - плохо отформатировано. его изображение и линия обтекает.

spioter 14.02.2023 17:54

Эти переменные не заполняются для наборов данных SAS. Они могут быть заполнены, если метаданные поступают из запроса внешней базы данных, с которой вы связали сеанс SAS.

Tom 14.02.2023 18:09

SAS — это не база данных. Однако возможно, что кто-то использует форматы для реализации этих концепций в наборах данных SAS. Формат 8.2 будет означать точность 8, масштаб 2.

Reeza 14.02.2023 18:28
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 цифр приводила к ошибкам?

spioter 14.02.2023 17:58

если вам нужно перенести набор данных SAS в систему реляционной базы данных, как бы вы определили, какие числовые переменные sas нуждаются в числовых (16,2), против битовых, против целых и т. д. и т. д.?

spioter 14.02.2023 17:59

Точно так же, как вы строите любую базу данных, спрашивая владельцев данных, что это за данные. Вероятно, есть документы, похожие на ту, на которую вы ссылаетесь, которые показывают методы SAS для запроса данных и делают обоснованные предположения о том, что это значит, на основе того, что в них содержится. Например, сколько различных значений имеет переменная? Какова «мощность» переменной? Имеет ли каждое наблюдение отдельное значение, тогда, возможно, переменная является КЛЮЧЕВОЙ.

Tom 14.02.2023 18:02

Я никогда не использовал SAS, поэтому я полагаюсь на вашу оценку репутации, но я ошеломлен тем, что SAS не предоставляет способа программно определять, применять и сообщать о точности/масштабе числовых переменных. У команды выше по течению есть сотни таблиц с тысячами столбцов — ручное документирование нюансов типов данных просто не масштабируется; Я буду сталкиваться с проблемами каждый раз, когда мы импортируем их данные. Думаю, я просто сделаю каждое число числом с плавающей запятой? это кажется безумием.

spioter 14.02.2023 18:16

SAS не является системой баз данных. Это система анализа. Вы можете связать SAS с системами реляционных баз данных, если этого требуют ваши данные.

Tom 14.02.2023 18:26

Если у них есть данные, которые описывают данные, вы можете легко использовать их для проведения анализа и даже для создания кода, необходимого для проведения анализа.

Tom 14.02.2023 18:29

Я ценю ваши ответы, просто жаль, что они не решают мою проблему. В конце концов я отмечу это как ответ, если никто другой не предоставит что-то более близкое к тому, что мне нужно. Еще один разглагольствования SAS: почему словарь.columns.precision и Dictionary.columns.scale существуют, если они никогда не заполняются? Или если их можно заселить, то как?

spioter 14.02.2023 18:36

Потому что вы можете подключиться к БД, которая имеет точность/масштаб, и в этом случае вы хотите, чтобы таблицы словаря отображали эту информацию.

Reeza 14.02.2023 19:21

SAS предлагает интерфейсы для многих СУБД, которые называются SAS/ACCESS Interface to <name of RDBMS>. При создании таблиц базы данных из наборов данных SAS эти интерфейсы обычно используют комбинацию типа данных SAS (числового и символьного) и формата, применяемого к переменной SAS. Например, я работаю в основном с базой данных Teradata. В документации по Teradata есть таблица, в которой показано, какие типы данных используются с определенными форматами SAS при создании таблиц Teradata из наборов данных SAS.

Обратите внимание на последнюю запись в таблице. Если числовая переменная имеет какой-либо другой формат или не имеет формата, то типом данных по умолчанию является число с плавающей запятой, которое будет захватывать значение, но, вероятно, не будет самым эффективным вариантом хранения.

По моему опыту, большинство аналитиков не тратят время на определение форматов для каждой переменной, если только набор данных не используется интенсивно или к нему обращаются неоднократно. Эта информация может не сильно вам помочь.

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