2013-11-27 53 views
0

我的数据是,SAS SQL:如何将不同列的值堆叠到一列中?

id date1 date1_flag date2 date2_flag date3 date3_flag 
001 20020212  1   
032 20061130  1 
020       20060603  2 
040 20041023  1 
094       20090110  2 
044             20040320  3 

..并在一点点超过20万项

我想有,

id date  date_flag 
001 20020212  1  
032 20061130  1 
020 20060603  2 
040 20041023  1 
094 20090110  2 
044 20040320  3 

基本上我想只挤一挤所有约会到一列和所有date_flags到一列。

每个ID只有一个日期(例如一个ID不能有date1和date2)。 我原以为这很容易,但我无法理解它。

回答

0

使用聚结的功能是这样的:

proc sql; 
create table NewTable as 
select coalesce(date1, date2, date3) as date 
, coalesce(date1_flag, date2_flag, date3_flag) as date_flag 
from YourTable; 
quit; 

合并将使用它找到的第一个值。所以,如果你确定每行只有一个日期/标志,这就可以实现。

0

有任何数量的这种解决方案...

你可以做一个数据的步骤,与阵列功能。按照Oliver的建议,您可以使用​​3210。你也可以使用UNION做到这一点:

proc sql; 
    select id, date1 as date, 1 as date_flag 
    from YourTable 
    where date1~=. 

    union all 
    select id, date2 as date, 2 as date_flag 
    from YourTable 
    where date2~=. 

    union all 
    select id, date3 as date, 3 as date_flag 
    from YourTable 
    where date3~=. 
quit; 

或者,最后,你可以使用SQL语句的情况下做到这一点,但是这可能过于复杂,所以我不会进入它。

0

由于其他人已经注意到有这样做的多种方式。您可能希望在proc sql中执行此操作,但我只是在数据步骤循环中使用条件语句执行此操作。

data work.Temp (rename = (date1 = date date1_flag = date_flag)); 
    input id date1 date1_flag date2 date2_flag date3 date3_flag; 
    if date2 NE . then date1 = date2; 
    if date3 NE . then date1 = date3; 
    if date2_flag NE . then date1_flag = date2_flag; 
    if date3_flag NE . then date1_flag = date3_flag; 
    drop date2 date2_flag date3 date3_flag; 

    datalines; 
    001 20020212  1 . . . . 
    032 20061130  1 . . . . 
    020  .   .   20060603  2 . . 
    040 20041023  1 . . . . 
    094   .   .  20090110  2 . . 
    044   .   .   .   .   20040320  3 
    ; 

run; 

proc print data=work.temp; run; 

期间.表示数据值为空/缺失。

相关问题