我需要一些proc SQL的帮助。我有这样一张桌子
ID1 ID2 DR1 DR2
1 03/04/2009 158 0
2 12/06/2009 214 0
2 05/02/2009 59 0
1 03/04/2009 0 158
2 03/04/2009 225 0
并且我想创建一个新表,其中每行DR2不为空,并且对于这些行中的每一行,搜索是否存在具有相同ID1和ID2且DR1等于DR2的值的另一行
对于这个例子,它会给我这个表:
ID1 ID2 DR1 DR2
1 03/04/2009 0 158
1 03/04/2009 158 0
我尝试分两步但没有成功:
data tmpTable;
set Table;
where DR2>0;
run;
proc sql;
create table wanted as
select * from tmpTable
inner join Table on Table.ID1 = tmpTable.ID1
and Table.ID2 = tmpTable.ID2
and Table.DR1 = tmpTable.DR2;
quit;
答案 0 :(得分:1)
您可以将文件与正确的where语句合并在一起。
请注意,null
为.
而不是0
- (您的数据步骤正在消除dr2 = 0的行,从而无法使您的结果表无效)
proc sql;
create table wanted as
select distinct *
from table_have a, table_have b
where
a.id1 = b.id1
and
a.ID2 = b.ID2
and
a.DR2 = b.DR1
and
a.dr2 ne .
;
quit;
答案 1 :(得分:1)
使查询正常工作,然后您只需添加它的创建表版本。
它应该只是一个基于相反列值的简单自连接,如下所示。
SELECT
t1.d1,
t1.id2,
t1.dr1,
t1.dr2
from
Table t1
JOIN Table t2
ON t1.d1 = t2.d1
AND t1.dr1 = t2.dr2
AND t1.dr2 = t2.dr1
where
t1.dr1 > 0
OR t2.dr2 > 0
我会确保你在(d1,dr1,dr2)上有一个索引用于性能目的。
您提到您只需要DR2具有值(非零/空)的记录。 where子句将确保至少其中一列具有值。因此,在您的示例中,它将找到158/0(第二列中为零),但是反过来(0,158)您的符合条件的DR2不为空。
返回两个版本的唯一时间是反转显示为连接表时。