SQL Как добавлять новые столбцы каждый раз, когда я запускаю свой код

#sql #sas

Вопрос:

Я хотел бы, чтобы каждый раз, когда я запускаю код, набор данных POLICY_VINTAGE добавлял результат подсчета (NRB) в результате обработки в виде другого столбца, например, Week2 и на следующей неделе 3. Есть ли для этого какая-либо дополнительная функция в SAS?

 PROC SQL;   create table POLICY_VINTAGE as  select distinct   POLICY_VINTAGE  ,count(NRB) as Week1  from PolisyEnd  where POLIS ="A"  group by   POLICY_VINTAGE  ; Quit; data POLICY_VINTAGE ; set _work.POLICY_VINTAGE  ; run;   

Комментарии:

1. Похоже, вам нужно историзировать свои данные, но почему у вас нет своего рода «даты историзации», которая менялась бы каждую неделю, а не новая колонка? Использовать историзированные данные будет намного проще

2. Не могли бы вы привести мне какой-нибудь пример, как это сделать ?

Ответ №1:

Для этого вам нужно будет объединить ваш исторический набор данных с новым набором данных. Было бы гораздо эффективнее хранить ваши исторические данные в длинном формате и представлять их в широком формате по мере необходимости.

Во-первых, чтобы ответить на ваш вопрос, давайте создадим некоторый код, который делает именно то, что вы просили. Будет вызван ваш первоначальный исторический набор policy_vintage_historical данных , и все новые данные будут объединены с ним.

Поскольку вы будете изменять постоянный набор данных, объединяя в него элементы, возможно, будет хорошей идеей использовать genmax опцию автоматического создания резервных копий вашего набора данных. Имейте в виду, что если ваш набор данных большой, это может оказаться невозможным, и вы не захотите его использовать.

 data lib.policy_vintage_historical;  merge lib.policy_vintage_historical  policy_vintage  ;   by policy_vintage; run;  

Более эффективный способ: сохраните его в длинном формате. Обратите внимание, что номер недели необходимо генерировать динамически. Вы можете сделать это любым способом, каким захотите.

Приведенный ниже код вычислит общее количество, а затем добавит его в длинный набор данных.

 PROC SQL;   create table POLICY_VINTAGE as  select distinct   POLICY_VINTAGE  , 1 as week  , count(nrb) as total  from PolisyEnd  where POLIS ="A"  group by   POLICY_VINTAGE quit;  proc append base=lib.policy_vintage_historical  data=policy_vintage  force; run;  

Если вы хотите отобразить это в длинном формате, используйте proc transpose . Обратите внимание, что перед транспонированием вам нужно будет либо отсортировать, либо проиндексировать policy_vintage внутри lib.policy_vintage_historical .

 proc transpose data = lib.policy_vintage_historical  out = policy_vintage_tpose(drop=_NAME_)  prefix = Week;  by policy_vintage;  id week;  var Total; run;  

Комментарии:

1. У меня есть вопрос, будет ли приложение работать, если, например, в первую неделю у меня будет, например, 2021-11, но на следующей неделе этого месяца записей больше не будет, он добавит мне элементы и поставит 0 в эту строку ?

2. Этого не произойдет. Вам нужно будет добавить дополнительную логику, такую как набор шаблонов всех уникальных винтажей политики. По умолчанию вы можете установить их все равными нулю. Если в вашем SQL-запросе есть какие-либо значения gt; 0, вы можете объединить его с этим набором данных и добавить. В противном случае вы можете просто добавить нулевые строки. Вы захотите сделать это с помощью макрокода ( %if , %then , %else ).

3. Я не знаю, правильно ли я понял, как я могу это сделать с помощью макросов. Вы можете привести мне пример ?

4. Существует специальная макросовая переменная с именем amp;sqlobs , которая сообщает, сколько значений было выбрано из последнего запроса sql. Вы могли бы сделать что-то вроде %if(amp;sqlobs. gt; 0) %then %do; lt;merge data with template of 0 values per policy_vintagegt;; %end; proc append ... того, что вы всегда будете добавлять набор данных, будь то нулевые значения или ненулевые значения. Я рекомендую ознакомиться с некоторыми примерами использования макросов на сайте справки SAS или начать новый вопрос. Этот раздел комментариев не предназначен для приведения примеров кода.