大家好我工作的是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;
我被困住了,无法找到我应该使用的方法。感谢您的帮助。
答案 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;