Эффективный дизайн рабочего процесса для объединения таблиц вместе - PullRequest
0 голосов
/ 20 ноября 2018

Мне нужно создать таблицу, которая содержит около 20 тыс. Строк и 10 тыс. Столбцов.Таблица будет создана путем объединения десятков исходных таблиц, скажем, A, B, C, .., F, и столбцы должны быть упорядочены соответствующим образом (сначала столбцы в A, затем столбцы в B и т. Д.).Таблица A устанавливает знаменатель и содержит все наблюдения, необходимые в финальной таблице.Все таблицы имеют одинаковый уникальный ключ для объединения / слияния.

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

Я делал как левое соединение B, левое соединение C, левое соединение D ...., и у меня вывод каждого слияния сохраняется постепенно.

В ситуации, когда C необходимо обновить до C * и снова объединить.Есть ли способ эффективно сделать это, вместо того, чтобы сделать что-то вроде слияния C *, слияния D, ... снова и снова для таблиц после C *.

Или иногда у меня есть A, B, D... готов.И я слил их по порядку.Тогда клиент готов.Мне нужно объединить C с A, B и повторить объединение для других таблиц снова и снова.Любой способ переосмыслить создание конечного вывода, чтобы избежать избыточности ??

Кроме того, должен ли индекс по ключу быть создан во всех исходных таблицах в этом вопросе?

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Это то, что я делаю, когда извлекаю данные из базы данных sql.Я извлекаю данные из разных таблиц и создаю отдельные наборы данных sas в основном в последовательном порядке, чтобы их было легко объединить по отдельности с помощью макросов.Затем я объединяю их на основе общих ключей.

%macro merging(otds, dsnum, keyvar);
%do i=1 %to &dsnum;
data out&i;
set in&i;
if ^missing(&keyvar);
run;
%end;
%do i=1 %to &dsnum;
proc sort data=out&i nodupkey;
by &keyvar;
run;
%end;
data &otds;
  merge
  %do i = 1 %to &dsnum;
    out&i
  %end; 
  ;
  by &keyvar;
  if &keyvar ne .;
run;
%mend;

%merge(outds,10,Key_Or_Id);

Итак, в приведенном выше коде у меня есть 10 таблиц in1-in10, и они объединены с общими ключами.Если какая-либо из этих таблиц будет обновлена ​​позже, мы сможем снова объединить, используя тот же подход ... надеюсь, это поможет!

0 голосов
/ 21 ноября 2018

@ Том для ответа слияния - лучший способ изначально объединить исходные таблицы.

Проблема начальной ситуации с некоторой таблицей C, имеющей столбцы, скажем, z1-z999, а затем последующие C* с колонками скажем z1-z250 и zed500-zed1729.Где исходные столбцы C, не входящие в C* (те z251-z999), должны располагаться в порядке столбцов объединенной таблицы?

Случай сохраненной истории, объединенной с новыми данными аналогичного, ноВариантная структура может быть несколько управляемой, если новые данные всегда охватывают желаемую область истории.Опцию набора данных OBS=0 можно использовать с наборами данных в merge, чтобы заставить неявную конструкцию вектора данных программы (PDV) иметь желаемый порядок столбцов.

Например,

data history;
  merge
    a(obs=0)
    b(obs=0)
    c(obs=0)
    d(obs=0)
    e(obs=0)
    history a b c d e;
  ;
  by key;
run;

Переменные в PDV будут упорядочены так же, как и порядок появления в наборах данных a-e.Любые переменные в history, а не в a-e, будут отображаться в крайнем правом углу PDV в порядке, указанном в обновляемом history.

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

0 голосов
/ 21 ноября 2018

Если идентификаторы уникальны (то есть вы НЕ выполняете сопоставление 1-N или N-М), просто объедините все таблицы одновременно.

data want ;
  merge a b c d e f ;
  by id;
run;

Вы можете поставитьсписок таблиц в макропеременную.

%let table_list=a b c2 d e f;
data want ;
  merge &table_list;
  by id;
run;

Вы можете иметь список в таблице метаданных и генерировать код из таблицы метаданных.

proc sql noprint;
  select memname
    into :table_list separated by ' '
    from my_metadata
    order by order_num
  ;
quit;

С точки зрения обновления простоодна из таблиц здесь - это метод, который должен устанавливать имена переменных в правильном порядке, но без необходимости перечитывать все данные из всех таблиц.

Составьте список столбцов, которые вы хотите отброситьиз текущей "главной" таблицы, которая пришла из OLD_C в макрос-переменную, давайте вызовем DROPLIST.Чтобы убедиться, что столбцы в порядке, вам все еще нужен список таблиц, но нам не нужно фактически перечитывать их все, нам просто нужно иметь возможность открывать их, чтобы SAS мог найти имена переменных в порядке,Обратите внимание, что этот список должен ссылаться на новую версию C, чтобы он видел переменные в этой версии C.

%let table_list=a b new_c d e f ;
%let droplist=c1 c2 c3 c4;
data new ;
  * Force new list of variables using NEW list of tables in order ;
  if 0 then set &table_list ;
  merge old(drop=&droplist) new_c ;
  by id;
run;
...