全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2878 4
2016-12-13
各位老师好,
请问sql通过关键变量连接2个表时,
如何只保留表2中的部分变量?
谢谢!

例如:
表1中有50个变量,其中关键变量是id;
表2中有30个变量,其中关键变量也是id;
如何用sql将表2中的部分变量(其中8个)通过id匹配到表1中?

proc sql;
    create table card_ as
    select *
    from card1 as one
    join card2(input(comperss(var1,"‘’"),$40.) as id
                            where var27 is not missing)
...

quit;

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2016-12-14 02:01:36
proc sql;
    create table card_ as
    select a.*,b.var1,b.var2```b.var8
    from card1 as a
    inner join card2 as b
on (input(comperss(a.var1,"‘’"),$40.) as a.id
=(input(comperss(b.var1,"‘’"),$40.) as b.id
where a.var27 is not missing
...

quit;
input(comperss(a.var1,"‘’")这一段我没这么干过,如果报错可以提前先分别处理好再直接a.id=b.id
inner join 适用于只保存两个表共有obs的情况,要保留左边或右边表全部记录就改成left join or right join
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-12-14 09:11:46
分析哥 发表于 2016-12-14 02:01
proc sql;
    create table card_ as
    select a.*,b.var1,b.var2```b.var8
好。
谢谢分析哥通宵达旦的给出指教。


input这段如果加as a.id/b.id确实会报错,
不加就不会报错,
但不知这样是否规范?
有哪位老师回答一下。

***这段运行正常;
把where直接放在card2后面(本来where 就是对card2进行筛选的) 匹配的数据才是真正想要的数据;
如果先配对再where话得到的是另一个目标的数据集;
where究竟放在哪个位置依据目的而定;

proc sql;
    create table card_ as
    select a.*,
            b.var1,
            b.var53,
            b.var54,
            b.var57,
            b.var58,
            b.var59,
            b.var60,
            b.var61
    from card1 as a
    left join card2 as b
    on input(compress(a.card_id,"‘’"),$40.) = (input(compress(b.var1,"‘’"),$40.))
    where b.var27 is not missing
    ;
quit;

proc sql;
        create table card_ as
        select a.*,
                        b.var1,
                        b.var53,
                        b.var54,
                        b.var57,
                        b.var58,
                        b.var59,
                        b.var60,
                        b.var61
        from card1 as a
        left join card2(where=(var27 is not missing)) as b
        on input(compress(a.card_id,"‘’"),$40.) = (input(compress(b.var1,"‘’"),$40.))
        ;
quit;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-12-15 04:04:52
priss111 发表于 2016-12-14 09:11
好。
谢谢分析哥通宵达旦的给出指教。
不客气,时差党表示用不着通宵达旦···where a 那个我随便写的,你想筛选B很容易改。不加as a.id的话,运行没有问题,只是变量名有时候会比较奇怪,虽然我不建议这么改,因为这些步骤完全可以提前完成,在一个query里面加太多function会让程序容易犯错,而且不太好理解。我建议在没有把握的情况下,不妨慢一点,一步一步的处理。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-12-15 08:57:35
分析哥 发表于 2016-12-15 04:04
不客气,时差党表示用不着通宵达旦···where a 那个我随便写的,你想筛选B很容易改。不加as a.id的话, ...
恩。
听你的。
在不报错的情况下按照规范来。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群