【问题标题】:Creating concatenative summary data in SAS (PROC SQL)在 SAS (PROC SQL) 中创建串联汇总数据
【发布时间】:2018-08-20 15:07:51
【问题描述】:

我有一个 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  

我需要将这些信息提炼成每个参考编号发生变化的摘要。当我在 SAS 中使用以下 PROC SQL 时:

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

我们将不胜感激提供的任何帮助!谢谢!

【问题讨论】:

  • 您只能进行 3 次更改,还是这只是您数据的一小部分?
  • 这只是一个小样本。实际数据集包含超过 200 个不同变量的变化数据,因此我需要一个可扩展的解决方案。
  • 为什么是 SQL?在数据步骤中会容易得多。

标签: sql sas db2


【解决方案1】:

如果您的数据是这样的,那么在您的代码中添加 group by 和 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;

【讨论】:

    【解决方案2】:

    我什至不会尝试在 PROC SQL 中做这样的事情。如果您只想查看每个变量的最后一个非空更改,请使用带有 UPDATE 语句的数据步骤将数据折叠到每组一个观察值。

    data want ;
      update have (obs=0) have ;
      by reference ;
      length changes $500 ;
      changes=catx(',',of change1-change3);
    run;
    

    【讨论】:

      【解决方案3】:

      我会使用数据步骤进行这种操作

      试试这个

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-11
        • 2021-10-19
        • 1970-01-01
        相关资源
        最近更新 更多