2017-08-17 81 views
1

我有两种方法做同样的事情,但没有得到相同的结果。这是什么原因?合并与Proc sql

第一种方式:

Proc sql; 
    Create table abc.immu as 
    select ID, DATE, CODE 
    from xyz.imm 
    where DATE between to_date('2008-01-01','YYYY-MM-DD') and to_date('2016-01-31','YYYY-MM-DD') 
    Order by CODE); 
     Quit; 

Proc sql ; 
    Create table abc.testb as 
      select CODE, description from xyz.REF_code where lower(description)like '%hep b%'; 
Quit; 

proc sort data=abc.testb; 
by code; 
run; 


data abc.testb1; 
merge abc.immu(in=a) abc.testb (in=b); 
by code; 
if a=1 and b=1; 
run; 

方式二

Create table abc.testb1 as 
     Select ID, DATE,CODE 
    From xyz.imm 
    where CODE in (select CODE from xyz.REF_code where lower(description)like '%hep b%') 
    AND DATE between to_date('2008-01-01','YYYY-MM-DD') and to_date('2016-01-31','YYYY-MM-DD') 
    Order by ID, DATE; 
    Quit; 

proc sort data=abc.testb1 nodupkey; 
by ID DATE; 
run; 

为什么我没有得到同样的结果?是不是两种不同的方式来实现相同的事情?

+0

相同结果我的意思是观察 – SAW

+2

to_date()在SAS中适合你吗?这不是SAS代码afaik,除非您使用通过,根据您发布的内容,这似乎不会发生。我*认为*如果您在任一表中有重复项,结果可能会有所不同。运行PROC COMPARE来查看结果的不同之处,这将有助于您找出问题的原因。 – Reeza

+0

是使用直通,即使在没有重复键的情况下,观察结果也不相同 – SAW

回答

0

最好的猜测是你在abc.testb的第一个块中有CODE记录的重复。 abc.immu表具有该代码,但是对于1个或多个CODE值,其记录数少于testb

举个例子:

测试数据:

data test; 
do cd='a','b','c'; 
    do i=1 to 10; 
     output; 
    end; 
end; 
run; 

data cds; 
do cd='a','c'; 
    desc=1; 
    output; 
    desc=2; 
    output; 
end; 
run; 

当我们在test每个代码都需要的工作更多的记录。下面生成相同的记录。

proc sql noprint; 
create table sql as 
select * from test 
    where cd in (select cd from cds); 
quit; 

data dataStep; 
merge test(in=a) cds(in=b); 
by cd; 
if a and b; 
run; 

但是,如果我们剥去cd="a"组只有1 test我们有一个问题:

data test2; 
set test; 
if cd='a' then 
    if i=1; 
run; 

proc sql noprint; 
create table sql2 as 
select * from test2 
    where cd in (select cd from cds); 
quit; 

data dataStep2; 
merge test2(in=a) cds(in=b); 
by cd; 
if a and b; 
run; 

现在有在dataStep2一个额外的记录。

为了解决这个问题,你有几种选择:

  1. 从选择删除description列,并使用一个DISTINCT关键字。然后testb将只有1行CODE
  2. 使用SQL解决方案。
+0

我检查了代码,测试b只有1行,每个代码 – SAW

+0

没有数据和一个工作示例,我们必须猜测。正如我所说,这是一个猜测。如果您可以通过示例复制问题,则有人可以解释该问题。请参阅https://stackoverflow.com/help/mcve – DomPazz