SAS присоединяет (или вставляет) столик к большому столу - PullRequest
0 голосов
/ 06 февраля 2019

У меня маленькая проблема.У меня есть большой стол и несколько столиков, где маленькие столы, включая часть полей из большой таблицы.Как я могу вставить (или объединить) таблицы на основе того, если поле одинаковое - установить данные, если в маленькой таблице нет поля из большого - установить null / 0 в большую таблицу.

Пример:

data temp1;
infile DATALINES dsd missover;
input a b c d e f g;
CARDS;
1, 2, 3, 4,5,6
2, 3, , 5
3, 3
4,,3,2,3,
;
run;

data temp2;
infile DATALINES dsd missover;
input a c e g;
CARDS;
5, 2, 3, 4
6, 3, , 5
7, 3
;
run;

Существует ли элегантный метод, при котором, если я вставлю temp2 в temp1 - отсутствующие поля в temp2 установят значение null в temp1?

Спасибо за помощь!

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

вы должны попробовать proc append.that будет более эффективным, потому что вы не будете читать свою большую таблицу снова и снова, в отличие от

 /*reads temp1 which is big table and temp2*/

 data temp3; 
 set temp1 temp2;
  run;

/ *, это похоже на код выше, но не будет читатьваш большой стол и будет эффективен * /

proc append base=temp1 data=temp2 force;
 run;

подробнее о процедуре добавьте в документацию http://support.sas.com/documentation/cdl/en/proc/65145/HTML/default/viewer.htm#n19kwc3onglzh2n1l2k4e39edv3x.htm

0 голосов
/ 06 февраля 2019

Это именно то, что SAS делает по умолчанию.

data want ; 
  set have1 have2;
run;

Он будет соответствовать переменным по имени, и любые переменные, которые не существуют (ни в одном из источников), будут иметь пропущенные значения.

Для повышения производительности при добавлении маленькой таблицы в большую таблицу вы должны использовать PROC APPEND вместо шага данных, чтобы не создавать новую копию большого набора данных.Это больше похоже на «вставку».Опция FORCE позволит различным наборам данных.Но поскольку новые данные добавляются в старый набор данных, любые дополнительные переменные, которые появляются только в HAVE2, будут просто игнорироваться, а их значения будут потеряны.

proc append base=have1 data=have2 force ;
run;

Если вам действительно нужно было сгенерироватьфактический оператор INSERT (возможно, вы на самом деле пытаетесь сгенерировать код SQL для запуска в чужой базе данных), вы можете сравнить метаданные двух наборов данных и найти общие переменные.

proc contents data=have1 out=cont1 noprint; run;
proc contents data=have2 out=cont2 noprint; run;
proc sql noprint;
  select a.name into :varlist separated by ','
  from cont2 a 
  inner join cont1 b 
  on upcase(a.name) = upcase(b.name)
  ;
...
insert into have1 (&varlist) select &varlist from have2 ;
0 голосов
/ 06 февраля 2019

Мне не очень понятно, какую операцию вы намереваетесь выполнить, но некоторые первоначальные мысли таковы:

  1. Чтобы сравнить столбцы между двумя наборами данных (и проверить, существует ли значение в одном из них)Хорошей практикой является использование внешнего соединения.Вы можете делать объединения с помощью предложения MERGE в шаге данных или более элегантно использовать PROC SQL.
  2. Однако, используя любой из этих подходов, вам нужно будет указать, какие две строки в temp1 и temp2 будут сравниваться - вы обычно объединяетесь в столбце, который доступен в обеих таблицах.

Чтобы помочь нам решить вашу проблему, не могли бы вы предоставить правильный вывод для желаемой операции, если вы выполняете ее на temp1 и temp2?Это покажет, какие опции вы изучили и что нужно исправить там.

...