#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 или начать новый вопрос. Этот раздел комментариев не предназначен для приведения примеров кода.