楼主: priss111
3407 3

请问用sql如何对2个表进行左合并(其中card2中同个id有多条记录)?谢谢。 [推广有奖]

  • 0关注
  • 5粉丝

副教授

15%

还不是VIP/贵宾

-

威望
0
论坛币
153 个
通用积分
47.5396
学术水平
11 点
热心指数
14 点
信用等级
10 点
经验
14938 点
帖子
473
精华
0
在线时间
805 小时
注册时间
2008-3-30
最后登录
2024-4-12

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
各位老师好:
请问如何用sql左合并2个数据集:
card1中每个id有1条观测,
card2中每个id有多条观测(只保留首次(var58=日期)不为缺失值的检测结果(var57=数值)),
如何将card2中首次不为缺失值的检测检测结果通过id匹配到card1中?
上述如何用sql实现?
谢谢。

下面这段sql运行后提示错误:
RROR 22-322: 语法错误,期望下列之一: 名称, 带引号的字符串, 数值常数, 日期时间常数, 缺失值, (,
              +, -, INPUT, NOT, PUT, ^, ~.
ERROR 201-322: 该选项不可识别,将被忽略。
ERROR 22-322: 语法错误,期望下列之一: 名称, 带引号的字符串, 数值常数, 日期时间常数, 缺失值, (,
              ), +, ',', -, INPUT, NOT, PUT, ^, ~.
ERROR 201-322: 该选项不可识别,将被忽略。
ERROR 22-322: 语法错误,期望下列之一: !, !!, &, ), *, **, +, -, /, <, <=, <>, =, >, >=, ?,
              AND, BETWEEN, CONTAINS, EQ, GE, GT, IN, IS, LE, LIKE, LT, NE, NOT, NOTIN, OR, ^,
              ^=, |, ||, ~, ~=.
ERROR 76-322: 语法错误,语句将被忽略。
ERROR: 解析 WHERE 子句时出现语法错误。
ERROR: 对于“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(where=(areatype not in ("港澳台" "外籍") and
            flagoval eq "已终审卡"                and
            typeocase in ("实验室诊断病例" "临床诊断病例") and
            dateotype between '01jul1985'd and '30jun2014'd and
            int(addcode/1000000) eq 44)) as a
        left join card2(where=(var57 is not missing and first.input(compress(b.var1,"‘’"),$40.) and first.var58)) as b
            
        on input(compress(a.card_id,"‘’"),$40.) = input(compress(b.var1,"‘’"),$40.);

quit;
二维码

扫码加我 拉你入群

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

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

关键词:card 多条记录 sql CAR left join 字符串 ERROR 记录 如何 检测

沙发
yangdelong1988 发表于 2016-12-14 17:14:36 |只看作者 |坛友微信交流群
你先把card2中的缺少值记录删除,然后对card2进行按照id排序
proc sort data=card2 nodupkey;by id;run;
nodupkey会自动保留按照id的第一项,然后把后面的删除
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
lovexialulu + 1 + 1 + 1 分析的有道理

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

藤椅
priss111 发表于 2016-12-15 08:55:43 |只看作者 |坛友微信交流群
yangdelong1988 发表于 2016-12-14 17:14
你先把card2中的缺少值记录删除,然后对card2进行按照id排序
proc sort data=card2 nodupkey;by id;run;
...
恩。
谢谢。

这些用data 步已经实现了。
但目前想用proc sql来优化一遍。

我想问proc sort这一步用proc sql如何实现?
之后如何根据发帖中提到的条件实现两个数据集left join?

使用道具

板凳
priss111 发表于 2016-12-16 16:34:29 |只看作者 |坛友微信交流群
yangdelong1988 发表于 2016-12-14 17:14
你先把card2中的缺少值记录删除,然后对card2进行按照id排序
proc sort data=card2 nodupkey;by id;run;
...
这个问题还是加了proc sort nodupkey才实现,
不知是否有不加proc sort nodupkey的优化方法。

***2.1:选择首次cd4检测结果与检测日期;
proc sql;
        create table flwfirst as
        select var1,var53,var54,var57,var58,var59,var60,var61,
        input(compress(var1,"‘’"),$40.) as cardid
        from epi.flw20140630
        where var57 is not missing
        group by input(compress(var1,"‘’"),$40.)
        having var58=min(var58)
        ;
quit;
proc sort data=flwfirst out=flwfirst nodupkey;
        by cardid var58;
        run;

***2.2:选择末次cd4检测结果与检测日期;
proc sql;
        create table flwlast as
        select  var1,var53,var54,var57,var58,var59,var60,var61
        from epi.flw20140630
        where var57 is not missing
        group by input(compress(var1,"‘’"),$40.)
        having var58=max(var58)
        ;
quit;
proc sort data=flwlast out=flwlast(rename=(var1=var1_ var53=var53_ var54=var54_
                var57=var57_ var58=var58_ var59=var59_ var60=var60_ var61=var61_)) nodupkey;
        by var1 var58;
        run;

proc sql;
        create table cardflw as
                select a.*,
                           b.*,
                           c.*
                from card(where=(areatype not in ("港澳台" "外籍") and
                        flagoval eq "已终审卡"                and
                        typeocase in ("实验室诊断病例" "临床诊断病例") and
                        dateotype between '01jul1985'd and '30jun2014'd and
                        int(addcode/1000000) eq 44)) as a
                left join flwfirst as b
                on input(compress(a.card_id,"‘’"),$40.) = input(compress(b.var1,"‘’"),$40.)
        left join flwlast as c
                on input(compress(a.card_id,"‘’"),$40.) = input(compress(c.var1_,"‘’"),$40.);
quit;

proc sort data=cardflw out=cardflw nodupkey;
        by card_id;
        run;

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 16:30