Как выполнить несколько левых объединений при сохранении существующего индекса? - PullRequest
0 голосов
/ 18 мая 2018

В SAS у меня есть большая таблица, которую я хочу увеличить с помощью информации из нескольких небольших таблиц, выполняя левые объединения (или эквивалентные).Моя логика требует много шагов (то есть не может объединить все одновременно).После каждого соединения я хочу сохранить существующий индекс large_table, используя его наилучшим образом.Как я могу переписать следующий код для достижения этой цели?

/*Join 1*/
proc sql;
  create table large_table as
  select a.*, b.newinfo1
  from large_table a
  left join small_table1 b on a.id = b.id;
quit;

/*some logic*/

/*Join 2*/
proc sql;
  create table large_table as
  select a.*, b.newinfo2
  from large_table a
  left join small_table2 b on a.id = b.id;
quit;

/*...*/

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

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

AРешение, центрированное на представлении, делает расширение large_table реагирующим на любые изменения в небольших таблицах при обновлении форматов концепций небольших таблиц.

Например,

data fmt1 / view=fmt1;
  fmtname = 'small_1_concept';
  set small_table1(rename=(id=start newinfo1=label));
run;
data fmt2 / view=fmt2;
  fmtname = 'small_2_concept';
  set small_table2(rename=(id=start newinfo2=label));
run;

proc format cntlin=fmt1;
proc format cntlin=fmt2;

proc sql;
  create view large_table_extended_v as
  select 
    large_table.*
  , id as id1 format=small_1_concept.
  , id as id2 format=small_2_concept.
  from
    large_table
  ;
quit;
0 голосов
/ 18 мая 2018

Лучше, конечно, выполнить один запрос.Но если у вас нет такой возможности, у вас есть несколько вариантов.

Самым SAS-подобным является не SQL-запрос, а оператор MODIFY.Это выполняет левое соединение и изменяет основной набор данных - не заменяет его.Вы должны иметь все предварительно определенные переменные, чтобы это работало.

data class(index=(name));
  set sashelp.class;
  call missing(predict);  *define PREDICT so it is available to be updated;
  where sex='F';
run;

data classfit(index=(name));
  set sashelp.classfit;
run;

data class;
  modify class classfit;  *only PREDICT will be appended here;
  by name;
  select (_IORC_);  *this processes the 'left' join;
    when (%sysrc(_sok))  replace;   *if in master then replace;
    when (%sysrc(_dsenmr)) delete;  *if not in master then delete;
    otherwise abort;
  end;
run;

proc contents data=class;
run;

Вы можете сделать что-то подобное в SQL, используя оператор UPDATE.

proc sql;
  update class
    set predict = (
      select predict from classfit
      where class.name=classfit.name
      );
quit;

proc contents data=class;
run;
...