У меня есть набор данных SAS (change_detail), который поддерживает переменные изменения и выглядит так (за исключением того, что в реальной таблице более 200 переменных изменений):

Reference Chg1Code Chg1Desc Chg2Code Chg2Desc Chg3Code Chg3Desc
--------- -------- -------- -------- -------- -------- --------
1234                        C        Change2
1234      C        Change1  C        Change2
1234      C        Change1                    C        Change3
2345      C        Change1                    C        Change3
2345                                          C        Change3
3456                        C        Change2  C        Change3
3456      C        Change1  C        Change2
3456      C        Change1
3456      C        Change1                    C        Change3  

Мне нужно перевести эту информацию в сводку изменений, которые произошли с каждым ссылочным номером. Когда я использовал следующий PROC SQL в SAS:

proc sql;
create table work.changedata_summary as 
select distinct 
      a.Reference, 
      catx(',',a.Chg1Desc,a.Chg2Desc,a.Chg3Desc) as Changes length=1000
from
      work.change_detail a
;
quit;

Он объединяет отдельные переменные описания изменений, но сохраняет исходное количество наблюдений на номер ссылки. Результаты, которые я получаю:

Reference Changes
--------- -------
1234      Change2
1234      Change1,Change2
1234      Change1,Change3
2345      Change1,Change3
2345      Change3
3456      Change2,Change3
3456      Change1,Change2
3456      Change1
3456      Change1,Change3

Мне нужна помощь в выравнивании этих данных (с использованием PROC SQL или шага DATA), чтобы показать только сводные результаты по отдельному справочному номеру. Ожидаемый результат:

Reference Changes
--------- -----------------------
1234      Change1,Change2,Change3
2345      Change1,Change3
3456      Change1,Change2,Change3

Любая предоставленная помощь будет оценена по достоинству! Благодарность!

1
Brian S 20 Авг 2018 в 18:07

3 ответа

Лучший ответ

Если ваши данные примерно такие, то добавление группы к и max в ваш код должно работать

  proc sql;
  create table work.changedata_summary as 
  select  
        Reference, 
  catx(',',max(chg1Desc),max(Chg2Desc), max(Chg3Desc)) as Changes length=1000
  from
  have 
  group by Reference
  ;
  quit;
0
Kiran 20 Авг 2018 в 16:11

Я бы использовал шаг данных для такой операции

Попробуйте это

data want;

length change_tot $200.;

   do until (last.Reference);

      set have;

        by Reference notsorted;

      change_tot=catx(',',change_tot,Chg1Desc, Chg2Desc, Chg3Desc);

   end;

   Keep reference change_tot;

run;
0
Helly 20 Авг 2018 в 20:37

Я бы даже не попытался сделать такую вещь в PROC SQL. Если вы просто хотите увидеть последнее непустое изменение для каждой переменной, используйте шаг данных с оператором UPDATE, чтобы свести данные к одному наблюдению на группу.

data want ;
  update have (obs=0) have ;
  by reference ;
  length changes $500 ;
  changes=catx(',',of change1-change3);
run;
0
Tom 20 Авг 2018 в 17:13
51933655