如何在SAS中组合和更新数据集

时间:2018-01-24 11:52:21

标签: sql sql-server sas

大家好我工作的是SAS平台,而且我的桌子是

dimension
rk | 1_nm | 2_rk | 2_nm | 2_parent_rk | 3_rk | 3_nm | 3_parent_rk

1    one     -     -        -            -      -        -
2    two     -     -        -            -      -        -
3     -       3    three    1            -      -        -
4     -       4    four     1            -      -        -
5     -       5    five     2            -      -        -
6     -       6    six      2            -      -        -
7     -       -     -       -            7      seven    3
8     -       -     -       -            8      eight    3
9     -       -     -       -            9      nine     5

我想简单地说这个数据集,我希望它转换为。

rk  | 1_nm |   2_nm        |   3_nm
1     one     -                -
2     two     -                -
3     one     one three        -
4     one     one four         -
5     two     two five         -
6     two     two six          -
7     one     one three     one three seven
8     one     one three     one three eight
9     two     two five      two five nine

这是我尝试过的

proc sql noprint;
create table dim as
select * 
from dimension;
quit;

proc sql noprint;
update dimension
set 1_nm = (select tbl.1_nm from dim as tbl where dimension.2_parent_rk eq tbl.rk); 
quit;

我被困住了,无法找到我应该使用的方法。感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

据我所知,你只需要一个join。鉴于您的结构,update似乎不合适 - 因为您的结果与输入的列不同。您可以使用以下命令创建新表。

proc sql;
    select rk, d.1_nm,
           (case when d2.2_nm is not null then d.1_nm || ' ' || d2.2_nm end) as 2_nm,
           (ase when d3.3_nm is not null then d.1_nm || ' ' || d2.2_nm || ' ' || d3.3_nm end) as 3_nm
    from dimension d left join
         dimension d2
         on d2.2_parent_rk = d.rk left join
         dimension d3
         on d3.3_parent_rk = d2.rk;

答案 1 :(得分:0)

如果您真的想要所有这些列并且在您的问题中只是稀疏,那么可以在更新中执行此操作。您可以使用UNDO_POLICY=NONE仅使用一个表执行此操作,也可以像上面一样在两个表中执行此操作。

这只是需要一堆查询,因为在这方面SAS基本上只是ANSI SQL。首先,我在rk_3_parent组中更新nm_2和rk_2_parent;然后我为所有这些更新rk_1(因此3的更改流向2)。然后我做了最后的更新,不需要联接来获得正确的名称(遗憾的是,由于某些原因,因为SAS不等待直到第一个发现之后才计算更新中的第二个字段。匹配 - 不知道为什么,但SQL对于这样的事情很奇怪。)

data dimension;
length nm_1 nm_2 nm_3$50;
input rk_1 nm_1 $ rk_2  nm_2 $ rk_2_parent  rk_3   nm_3 $ rk_3_parent;
datalines;
1    one     .     .        .            .      .        .
2    two     .     .        .            .      .        .
3     .       3    three    1            .      .        .
4     .       4    four     1            .      .        .
5     .       5    five     2            .      .        .
6     .       6    six      2            .      .        .
7     .       .     .       .            7      seven    3
8     .       .     .       .            8      eight    3
9     .       .     .       .            9      nine     5
;;;;
run;

proc sql undo_policy=none;
  update dimension master
  set nm_2 = (
        select nm_2
        from dimension parent
        where parent.rk_2 = master.rk_3_parent
        )
        where master.rk_3 is not null
    ;
update dimension master
  set rk_2_parent = (
        select rk_2_parent
        from dimension parent
        where parent.rk_2 = master.rk_3_parent
        )
        where master.rk_3_parent is not null
    ;

  update dimension master
    set nm_1 = (
        select nm_1
        from dimension parent
        where parent.rk_1 = master.rk_2_parent
        )
        where master.rk_2_parent is not null
    ;
  update dimension master
    set nm_2 = catx(' ',nm_1,nm_2),
        nm_3 = catx(' ',nm_1,nm_2,nm_3);

quit;