自连接 - 更新变量 - proc sql

问题描述 投票:0回答:1

你能帮我解决这个问题吗?我为您缩短了示例,所以可以说我有这张表:

data MyTable;
    input Household age gender $ flag;
    datalines;
1 45 male married
1 35 female married
2 50 female married
2 52 male married
3 32 male child
3 50 male married
3 60 female married
;
run;

我有已婚夫妇和家庭中的其他人,我需要将丈夫的价值观加入到妻子中,并将妻子的价值观加入到丈夫中以获得此输出:

data MyTable2;
    input Household age gender $ flag $ age_partner;
    datalines;
1 45 male married 35
1 35 female married 45
2 50 female married 52
2 52 male married 50
3 32 male child  
3 50 male married 60
3 60 female married 50
;
run;

这就是我尝试过的代码,但是,是的,这不起作用,它只执行语句的 t2 部分。

proc sql;
  create table MyTable2 as
  select t1.\*, t2.age as age_partner, t3.age as age_partner
  from MyTable as t1
  left join (select household, age from MyTable where gender = 'male' & flag = 'married') as t2
    on t1.household=t2.household & t1.gender = 'female' & t1.flag = 'married'

  left join (select household, age from MyTable where gender = 'female' & flag = 'married') as t3
    on t1.household=t3.household & t1.gender = 'male' & t1.flag = 'married'; 
quit;

如果我将这两个连接分开,那么从逻辑上讲,最后一个自连接会重写前一个连接,并且在输出中只有丈夫会有妻子的年龄,而妻子不会有丈夫的年龄。

当然,我可以在单独的列中进行操作,然后在第三列中进行所需的输出。

但是你知道一些解决方案可以在一个 proc sql 代码中完成它吗?

提前非常感谢!

sql sas self-join proc-sql
1个回答
0
投票

假设你的逻辑成立(我怀疑由于各种数据质量原因这不会成立)。

proc sql;
create table want as
select t1.*, case when t1.flag='married' then t2.age else . end as age_partner
from mytable as t1
left join (select * from mytable where flag='married') as t2
on t1.household=t2.household and t1.gender ne t2.gender;
quit;
© www.soinside.com 2019 - 2024. All rights reserved.